From b71edbf47b2fdfd04f44d73a9d3944163e7c2631 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 3 Jun 2026 16:45:03 +0200 Subject: [PATCH 1/6] Replace ICU with a bundled Unicode case table for lower()/upper() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ICU's value for Zero was only Unicode lower()/upper() (zqlite compiles ILIKE to lower(col) LIKE lower(pattern)), but linking it has been a continual source of pain: no -fPIC distro static archives, soname coupling that breaks glibc consumers (libicui18n.so.67), QEMU arm builds, ~28MB, and a Windows exception. Drop the ICU dependency entirely. Register Unicode-aware lower()/upper() on every connection from an embedded case-mapping table generated from Node's toLowerCase/toUpperCase (so the SQL functions match the client-side IVM matcher). The result is self-contained on every platform (incl. Windows), with no runtime ICU, no -fPIC/soname/QEMU problems, and ~120KB of generated data. - deps/gen-unicode-case.mjs: generator -> src/util/unicode_case_data.h. - src/util/unicode_case.cpp: UTF-8 case transform + lower()/upper(), registered via sqlite3_auto_extension in the addon init. - Remove SQLITE_ENABLE_ICU, deps/icu.js, and the ICU gyp linking. - Rename test/52.icu.js -> test/52.unicode-case.js; assert lower()/upper() match JavaScript across scripts and 1:many mappings (ß->SS, İ->i̇). Scope: context-free case mapping only (no folding, no Greek final-sigma context). Follow-ups: the now-dead CI ICU installs can be removed (pairs with the native arm64 PR), and the zero_sqlite3 shell still uses ASCII lower()/upper(). Co-Authored-By: Claude Opus 4.8 (1M context) --- binding.gyp | 13 - deps/download.sh | 8 - deps/gen-unicode-case.mjs | 56 + deps/icu.js | 174 -- deps/sqlite3.gyp | 9 - src/better_sqlite3.cpp | 4 + src/util/unicode_case.cpp | 143 ++ src/util/unicode_case_data.h | 3090 ++++++++++++++++++++++++++++++++++ test/52.icu.js | 40 - test/52.unicode-case.js | 75 + 10 files changed, 3368 insertions(+), 244 deletions(-) create mode 100644 deps/gen-unicode-case.mjs delete mode 100644 deps/icu.js create mode 100644 src/util/unicode_case.cpp create mode 100644 src/util/unicode_case_data.h delete mode 100644 test/52.icu.js create mode 100644 test/52.unicode-case.js diff --git a/binding.gyp b/binding.gyp index f1fff11..d5582af 100644 --- a/binding.gyp +++ b/binding.gyp @@ -24,12 +24,6 @@ }, }, 'conditions': [ - # ICU is statically linked into the SQLite static library on - # non-Windows; the final .node must resolve its ICU symbols. (See - # deps/sqlite3.gyp for why Windows is excluded.) - ['OS != "win"', { - 'libraries': [' src/util/unicode_case_data.h + +const MAX = 0x10ffff; + +function mappings(method) { + const rows = []; + for (let cp = 0; cp <= MAX; cp++) { + if (cp >= 0xd800 && cp <= 0xdfff) continue; // lone surrogates + const ch = String.fromCodePoint(cp); + const mapped = ch[method](); + if (mapped === ch) continue; + const to = Array.from(mapped, c => c.codePointAt(0)); + if (to.length > 3) throw new Error(`mapping for U+${cp.toString(16)} > 3 cps`); + rows.push([cp, to]); + } + return rows; +} + +function emit(name, rows) { + const lines = rows.map(([from, to]) => { + const t = [...to, 0, 0, 0].slice(0, 3).map(c => `0x${c.toString(16)}u`); + return ` {0x${from.toString(16)}u, {${t.join(', ')}}, ${to.length}},`; + }); + return ( + `static const ZeroCaseMap ${name}[] = {\n${lines.join('\n')}\n};\n` + + `static const int ${name}Len = ${rows.length};\n` + ); +} + +const lower = mappings('toLowerCase'); +const upper = mappings('toUpperCase'); + +process.stdout.write( + `// AUTO-GENERATED by deps/gen-unicode-case.mjs — DO NOT EDIT.\n` + + `// Source: Node ${process.versions.node} (Unicode ${process.versions.unicode}).\n` + + `// Each row maps one source code point to 1-3 target code points, matching\n` + + `// JavaScript String.prototype.toLowerCase/toUpperCase (context-free).\n` + + `#ifndef ZERO_UNICODE_CASE_DATA_H\n#define ZERO_UNICODE_CASE_DATA_H\n\n` + + `typedef struct ZeroCaseMap {\n` + + ` unsigned int from;\n unsigned int to[3];\n unsigned char n;\n` + + `} ZeroCaseMap;\n\n` + + emit('kZeroLowerMap', lower) + + `\n` + + emit('kZeroUpperMap', upper) + + `\n#endif /* ZERO_UNICODE_CASE_DATA_H */\n`, +); diff --git a/deps/icu.js b/deps/icu.js deleted file mode 100644 index 5b38c09..0000000 --- a/deps/icu.js +++ /dev/null @@ -1,174 +0,0 @@ -'use strict'; - -// === -// ICU discovery helper for node-gyp. -// -// Defining SQLITE_ENABLE_ICU compiles SQLite's bundled ICU extension (already -// present in the amalgamation, guarded by #ifdef SQLITE_ENABLE_ICU) and -// auto-registers Unicode-aware LIKE/upper()/lower()/REGEXP on every -// connection. That code calls into ICU. -// -// We STATIC-link ICU where we can, so the prebuilt .node stays self-contained. -// That is only possible where the ICU static archives are position-independent -// (-fPIC) and can be linked into a shared object (the .node) — which in practice -// is ONLY macOS (Homebrew). Both Linux flavors ship NON-PIC static archives: -// Debian/Ubuntu (glibc) AND Alpine (musl) both fail with "recompile with -fPIC". -// So on every Linux we link ICU dynamically against the system .so, and the -// consumer must have ICU installed at runtime (e.g. `apk add icu-libs` in the -// zero-cache Alpine image). See `useStatic` below. -// -// Usage: -// node icu.js include -> the ICU include directory (for #include ) -// node icu.js libs -> newline-separated linker inputs (static archive -// paths or -L/-l flags), then the C++ runtime / -// system libraries ICU depends on. -// -// Discovery order: pkg-config (Linux) -> Homebrew icu4c (macOS) -> common system -// locations. Set ICU_ROOT to override (expects ICU_ROOT/lib and ICU_ROOT/include). -// -// ICU is not enabled on Windows (see deps/sqlite3.gyp), so this script only -// ever runs on macOS and Linux. -// === - -const {execSync} = require('child_process'); -const fs = require('fs'); -const path = require('path'); - -const isMac = process.platform === 'darwin'; - -// Static-link ICU only on macOS, the one platform whose static archives are -// -fPIC and so can be linked into the .node shared object. Both Debian/Ubuntu -// (glibc) and Alpine (musl) ship NON-PIC static archives (libicu*.a) that fail -// with "relocation ... can not be used when making a shared object; recompile -// with -fPIC", so on all Linux we link ICU dynamically against the system .so -// and the consumer must have ICU at runtime. ICU_ALLOW_DYNAMIC=1 forces dynamic -// even on macOS, as a local-dev escape hatch. -const useStatic = isMac && process.env.ICU_ALLOW_DYNAMIC !== '1'; - -function run(cmd) { - try { - return execSync(cmd, {stdio: ['ignore', 'pipe', 'ignore']}).toString().trim(); - } catch { - return ''; - } -} - -function firstDir(candidates) { - return candidates.find(p => p && fs.existsSync(p)) || ''; -} - -// An include dir is only useful if the ICU headers are actually under it -// (/unicode/utypes.h). Validating this lets us reject a misconfigured -// pkg-config .pc and fall through to another discovery method, instead of -// emitting a bogus path that fails later with a confusing missing-header error. -function hasIcuHeaders(dir) { - return !!dir && fs.existsSync(path.join(dir, 'unicode', 'utypes.h')); -} - -function fail(message) { - process.stderr.write(`deps/icu.js: ${message}\n`); - process.exit(1); -} - -// Locate the ICU lib and include directories. Returns {libDir, includeDir}. -function locate() { - if (process.env.ICU_ROOT) { - const root = process.env.ICU_ROOT; - return {libDir: path.join(root, 'lib'), includeDir: path.join(root, 'include')}; - } - - // pkg-config (Debian's libicu-dev and Alpine's icu-dev ship icu-i18n.pc). - // Require both the lib dir and the actual ICU headers before trusting it. - const pcLibDir = run('pkg-config --variable=libdir icu-i18n'); - const pcIncDir = run('pkg-config --variable=includedir icu-i18n'); - if (pcLibDir && fs.existsSync(pcLibDir) && hasIcuHeaders(pcIncDir)) { - return {libDir: pcLibDir, includeDir: pcIncDir}; - } - - // Homebrew icu4c (macOS, keg-only so not on default search paths). - if (isMac) { - let prefix = run('brew --prefix icu4c'); - if (!prefix || !fs.existsSync(prefix)) { - prefix = firstDir(['/opt/homebrew/opt/icu4c', '/usr/local/opt/icu4c']); - } - if (prefix) { - return {libDir: path.join(prefix, 'lib'), includeDir: path.join(prefix, 'include')}; - } - } - - // Common system locations (Debian multiarch, Alpine, manual installs). - const libDir = firstDir([ - '/usr/lib/x86_64-linux-gnu', - '/usr/lib/aarch64-linux-gnu', - '/usr/lib/arm-linux-gnueabihf', - '/usr/lib', - '/usr/local/lib', - ]); - const includeDir = ['/usr/include', '/usr/local/include'].find(hasIcuHeaders) || ''; - return {libDir, includeDir}; -} - -// ICU static archives, in dependency order (i18n -> uc -> data). -const ARCHIVE_NAMES = ['libicui18n', 'libicuuc', 'libicudata']; - -// Full paths to the ICU static archives, so the linker pulls them in -// statically and the resulting binary stays self-contained. -function staticLibInputs(loc) { - return ARCHIVE_NAMES.map(name => { - const full = loc.libDir && path.join(loc.libDir, name + '.a'); - if (full && fs.existsSync(full)) { - return full; - } - // macOS is the only static platform; a missing archive is fatal here (we - // must not silently fall back to a dynamic build that would change the - // shipped binary's behavior). - fail( - `static ICU archive ${name}.a not found in ${loc.libDir || '(unknown library dir)'}.\n` + - ` macOS links ICU statically to stay self-contained, so the build is aborting rather\n` + - ` than linking ICU dynamically. Install icu4c via Homebrew (brew install icu4c), or\n` + - ` set ICU_ALLOW_DYNAMIC=1 to allow a dynamic fallback for local development.`, - ); - return null; // unreachable; fail() exits - }); -} - -// Ordinary -l flags, resolved against the system ICU shared libraries. Used on -// glibc Linux (Debian/Ubuntu), whose static archives are not -fPIC and so can't -// be linked into a shared object; the consumer must have ICU at runtime. -function dynamicLibInputs(loc) { - const out = []; - if (loc.libDir) { - out.push('-L' + loc.libDir); - } - for (const name of ARCHIVE_NAMES) { - out.push('-l' + name.replace(/^lib/, '')); - } - return out; -} - -function libsOutput(loc) { - const out = useStatic ? staticLibInputs(loc) : dynamicLibInputs(loc); - // C++ runtime + system libraries that ICU depends on. - if (isMac) { - out.push('-lc++'); - } else { - out.push('-lstdc++', '-lm', '-lpthread', '-ldl'); - } - return out; -} - -const mode = process.argv[2]; -const loc = locate(); - -if (mode === 'include') { - if (!hasIcuHeaders(loc.includeDir)) { - fail( - `could not find the ICU headers (unicode/utypes.h) in ${loc.includeDir || '(unknown include dir)'}.\n` + - ` Install the ICU development package (libicu-dev on Debian, icu-dev on Alpine,\n` + - ` icu4c via Homebrew on macOS), or set ICU_ROOT to an ICU install prefix.`, - ); - } - process.stdout.write(loc.includeDir); -} else { - process.stdout.write(libsOutput(loc).join('\n')); -} diff --git a/deps/sqlite3.gyp b/deps/sqlite3.gyp index cad0a81..b4021cd 100755 --- a/deps/sqlite3.gyp +++ b/deps/sqlite3.gyp @@ -58,15 +58,6 @@ 'SQLITE_ENABLE_COLUMN_METADATA', ], }], - # Unicode-aware LIKE/upper()/lower() via SQLite's bundled ICU extension, - # statically linked so the prebuilt binaries stay self-contained. - # Not enabled on Windows yet: static ICU there means building it from - # source (vcpkg), which is impractically slow in CI. Windows therefore - # keeps SQLite's ASCII-only LIKE for now. - ['OS != "win"', { - 'defines': ['SQLITE_ENABLE_ICU'], - 'include_dirs': ['= 140 @@ -55,6 +56,9 @@ NODE_MODULE_INIT(/* exports, context */) { v8::HandleScope scope(isolate); Addon::ConfigureURI(); + // Register Unicode-aware lower()/upper() on every connection (replaces ICU). + sqlite3_auto_extension((void (*)(void))zeroRegisterUnicodeCase); + // Initialize addon instance. Addon* addon = new Addon(isolate); v8::Local data = v8::External::New(isolate, addon); diff --git a/src/util/unicode_case.cpp b/src/util/unicode_case.cpp new file mode 100644 index 0000000..0210b97 --- /dev/null +++ b/src/util/unicode_case.cpp @@ -0,0 +1,143 @@ +// Unicode-aware lower()/upper() SQL functions backed by a generated case table +// (unicode_case_data.h), so the driver gets Unicode case conversion without an +// ICU dependency. The table is generated from Node's toLowerCase/toUpperCase +// (see deps/gen-unicode-case.mjs), so these match the client-side IVM matcher's +// case conversion. Registered as an auto-extension, overriding SQLite's +// ASCII-only built-in lower()/upper() on every connection. +// +// Scope: context-free case mapping (the common case). It does not implement +// context-sensitive rules such as Greek final sigma; JavaScript's toLowerCase +// applies those, so a word-final Σ can differ. The zqlite ILIKE parity test +// guards the cases Zero relies on. + +#include "unicode_case_data.h" + +namespace UnicodeCase { + +// Decodes one UTF-8 code point from s[*i, n). Advances *i past it. Returns +// U+FFFD for malformed input (consuming a single byte) so we never loop. +static unsigned int Utf8Decode(const unsigned char* s, int n, int* i) { + unsigned int c = s[*i]; + if (c < 0x80) { *i += 1; return c; } + if ((c >> 5) == 0x6 && *i + 1 < n) { + unsigned int r = ((c & 0x1Fu) << 6) | (s[*i + 1] & 0x3Fu); + *i += 2; return r; + } + if ((c >> 4) == 0xE && *i + 2 < n) { + unsigned int r = ((c & 0x0Fu) << 12) | ((s[*i + 1] & 0x3Fu) << 6) | (s[*i + 2] & 0x3Fu); + *i += 3; return r; + } + if ((c >> 3) == 0x1E && *i + 3 < n) { + unsigned int r = ((c & 0x07u) << 18) | ((s[*i + 1] & 0x3Fu) << 12) | + ((s[*i + 2] & 0x3Fu) << 6) | (s[*i + 3] & 0x3Fu); + *i += 4; return r; + } + *i += 1; return 0xFFFDu; +} + +// Encodes `cp` as UTF-8 into `out` (>= 4 bytes). Returns bytes written. +static int Utf8Encode(unsigned int cp, char* out) { + if (cp < 0x80) { + out[0] = (char)cp; return 1; + } + if (cp < 0x800) { + out[0] = (char)(0xC0 | (cp >> 6)); + out[1] = (char)(0x80 | (cp & 0x3F)); + return 2; + } + if (cp < 0x10000) { + out[0] = (char)(0xE0 | (cp >> 12)); + out[1] = (char)(0x80 | ((cp >> 6) & 0x3F)); + out[2] = (char)(0x80 | (cp & 0x3F)); + return 3; + } + out[0] = (char)(0xF0 | (cp >> 18)); + out[1] = (char)(0x80 | ((cp >> 12) & 0x3F)); + out[2] = (char)(0x80 | ((cp >> 6) & 0x3F)); + out[3] = (char)(0x80 | (cp & 0x3F)); + return 4; +} + +// Binary searches `map` (sorted by .from) for `cp`. Returns NULL if absent. +static const ZeroCaseMap* Lookup(const ZeroCaseMap* map, int len, unsigned int cp) { + int lo = 0, hi = len - 1; + while (lo <= hi) { + int mid = (lo + hi) >> 1; + unsigned int f = map[mid].from; + if (cp < f) hi = mid - 1; + else if (cp > f) lo = mid + 1; + else return &map[mid]; + } + return NULL; +} + +static void Apply(sqlite3_context* ctx, sqlite3_value* arg, const ZeroCaseMap* map, int len) { + if (sqlite3_value_type(arg) == SQLITE_NULL) { + sqlite3_result_null(ctx); + return; + } + // Request UTF-8 text first, then its byte length (SQLite requires this order). + const unsigned char* in = sqlite3_value_text(arg); + if (in == NULL) { + sqlite3_result_null(ctx); + return; + } + int n = sqlite3_value_bytes(arg); + + int cap = n + 16; + char* out = (char*)sqlite3_malloc(cap); + if (!out) { + sqlite3_result_error_nomem(ctx); + return; + } + int outn = 0; + int i = 0; + while (i < n) { + unsigned int cp = Utf8Decode(in, n, &i); + // Reserve room for up to 3 mapped code points (4 bytes each). + if (outn + 12 > cap) { + cap = cap * 2 + 16; + char* grown = (char*)sqlite3_realloc(out, cap); + if (!grown) { + sqlite3_free(out); + sqlite3_result_error_nomem(ctx); + return; + } + out = grown; + } + const ZeroCaseMap* m = Lookup(map, len, cp); + if (m) { + for (int k = 0; k < m->n; k++) outn += Utf8Encode(m->to[k], out + outn); + } else { + outn += Utf8Encode(cp, out + outn); + } + } + sqlite3_result_text(ctx, out, outn, sqlite3_free); +} + +static void LowerFunc(sqlite3_context* ctx, int argc, sqlite3_value** argv) { + (void)argc; + Apply(ctx, argv[0], kZeroLowerMap, kZeroLowerMapLen); +} + +static void UpperFunc(sqlite3_context* ctx, int argc, sqlite3_value** argv) { + (void)argc; + Apply(ctx, argv[0], kZeroUpperMap, kZeroUpperMapLen); +} + +} // namespace UnicodeCase + +// Auto-extension entry point: invoked by SQLite for every new connection. +// Overrides the built-in ASCII-only lower()/upper() with Unicode-aware ones. +extern "C" int zeroRegisterUnicodeCase( + sqlite3* db, + char** pzErrMsg, + const sqlite3_api_routines* pApi +) { + (void)pzErrMsg; + (void)pApi; + int flags = SQLITE_UTF8 | SQLITE_DETERMINISTIC; + int rc = sqlite3_create_function(db, "lower", 1, flags, NULL, UnicodeCase::LowerFunc, NULL, NULL); + if (rc != SQLITE_OK) return rc; + return sqlite3_create_function(db, "upper", 1, flags, NULL, UnicodeCase::UpperFunc, NULL, NULL); +} diff --git a/src/util/unicode_case_data.h b/src/util/unicode_case_data.h new file mode 100644 index 0000000..85a9a9a --- /dev/null +++ b/src/util/unicode_case_data.h @@ -0,0 +1,3090 @@ +// AUTO-GENERATED by deps/gen-unicode-case.mjs — DO NOT EDIT. +// Source: Node 24.16.0 (Unicode 17.0). +// Each row maps one source code point to 1-3 target code points, matching +// JavaScript String.prototype.toLowerCase/toUpperCase (context-free). +#ifndef ZERO_UNICODE_CASE_DATA_H +#define ZERO_UNICODE_CASE_DATA_H + +typedef struct ZeroCaseMap { + unsigned int from; + unsigned int to[3]; + unsigned char n; +} ZeroCaseMap; + +static const ZeroCaseMap kZeroLowerMap[] = { + {0x41u, {0x61u, 0x0u, 0x0u}, 1}, + {0x42u, {0x62u, 0x0u, 0x0u}, 1}, + {0x43u, {0x63u, 0x0u, 0x0u}, 1}, + {0x44u, {0x64u, 0x0u, 0x0u}, 1}, + {0x45u, {0x65u, 0x0u, 0x0u}, 1}, + {0x46u, {0x66u, 0x0u, 0x0u}, 1}, + {0x47u, {0x67u, 0x0u, 0x0u}, 1}, + {0x48u, {0x68u, 0x0u, 0x0u}, 1}, + {0x49u, {0x69u, 0x0u, 0x0u}, 1}, + {0x4au, {0x6au, 0x0u, 0x0u}, 1}, + {0x4bu, {0x6bu, 0x0u, 0x0u}, 1}, + {0x4cu, {0x6cu, 0x0u, 0x0u}, 1}, + {0x4du, {0x6du, 0x0u, 0x0u}, 1}, + {0x4eu, {0x6eu, 0x0u, 0x0u}, 1}, + {0x4fu, {0x6fu, 0x0u, 0x0u}, 1}, + {0x50u, {0x70u, 0x0u, 0x0u}, 1}, + {0x51u, {0x71u, 0x0u, 0x0u}, 1}, + {0x52u, {0x72u, 0x0u, 0x0u}, 1}, + {0x53u, {0x73u, 0x0u, 0x0u}, 1}, + {0x54u, {0x74u, 0x0u, 0x0u}, 1}, + {0x55u, {0x75u, 0x0u, 0x0u}, 1}, + {0x56u, {0x76u, 0x0u, 0x0u}, 1}, + {0x57u, {0x77u, 0x0u, 0x0u}, 1}, + {0x58u, {0x78u, 0x0u, 0x0u}, 1}, + {0x59u, {0x79u, 0x0u, 0x0u}, 1}, + {0x5au, {0x7au, 0x0u, 0x0u}, 1}, + {0xc0u, {0xe0u, 0x0u, 0x0u}, 1}, + {0xc1u, {0xe1u, 0x0u, 0x0u}, 1}, + {0xc2u, {0xe2u, 0x0u, 0x0u}, 1}, + {0xc3u, {0xe3u, 0x0u, 0x0u}, 1}, + {0xc4u, {0xe4u, 0x0u, 0x0u}, 1}, + {0xc5u, {0xe5u, 0x0u, 0x0u}, 1}, + {0xc6u, {0xe6u, 0x0u, 0x0u}, 1}, + {0xc7u, {0xe7u, 0x0u, 0x0u}, 1}, + {0xc8u, {0xe8u, 0x0u, 0x0u}, 1}, + {0xc9u, {0xe9u, 0x0u, 0x0u}, 1}, + {0xcau, {0xeau, 0x0u, 0x0u}, 1}, + {0xcbu, {0xebu, 0x0u, 0x0u}, 1}, + {0xccu, {0xecu, 0x0u, 0x0u}, 1}, + {0xcdu, {0xedu, 0x0u, 0x0u}, 1}, + {0xceu, {0xeeu, 0x0u, 0x0u}, 1}, + {0xcfu, {0xefu, 0x0u, 0x0u}, 1}, + {0xd0u, {0xf0u, 0x0u, 0x0u}, 1}, + {0xd1u, {0xf1u, 0x0u, 0x0u}, 1}, + {0xd2u, {0xf2u, 0x0u, 0x0u}, 1}, + {0xd3u, {0xf3u, 0x0u, 0x0u}, 1}, + {0xd4u, {0xf4u, 0x0u, 0x0u}, 1}, + {0xd5u, {0xf5u, 0x0u, 0x0u}, 1}, + {0xd6u, {0xf6u, 0x0u, 0x0u}, 1}, + {0xd8u, {0xf8u, 0x0u, 0x0u}, 1}, + {0xd9u, {0xf9u, 0x0u, 0x0u}, 1}, + {0xdau, {0xfau, 0x0u, 0x0u}, 1}, + {0xdbu, {0xfbu, 0x0u, 0x0u}, 1}, + {0xdcu, {0xfcu, 0x0u, 0x0u}, 1}, + {0xddu, {0xfdu, 0x0u, 0x0u}, 1}, + {0xdeu, {0xfeu, 0x0u, 0x0u}, 1}, + {0x100u, {0x101u, 0x0u, 0x0u}, 1}, + {0x102u, {0x103u, 0x0u, 0x0u}, 1}, + {0x104u, {0x105u, 0x0u, 0x0u}, 1}, + {0x106u, {0x107u, 0x0u, 0x0u}, 1}, + {0x108u, {0x109u, 0x0u, 0x0u}, 1}, + {0x10au, {0x10bu, 0x0u, 0x0u}, 1}, + {0x10cu, {0x10du, 0x0u, 0x0u}, 1}, + {0x10eu, {0x10fu, 0x0u, 0x0u}, 1}, + {0x110u, {0x111u, 0x0u, 0x0u}, 1}, + {0x112u, {0x113u, 0x0u, 0x0u}, 1}, + {0x114u, {0x115u, 0x0u, 0x0u}, 1}, + {0x116u, {0x117u, 0x0u, 0x0u}, 1}, + {0x118u, {0x119u, 0x0u, 0x0u}, 1}, + {0x11au, {0x11bu, 0x0u, 0x0u}, 1}, + {0x11cu, {0x11du, 0x0u, 0x0u}, 1}, + {0x11eu, {0x11fu, 0x0u, 0x0u}, 1}, + {0x120u, {0x121u, 0x0u, 0x0u}, 1}, + {0x122u, {0x123u, 0x0u, 0x0u}, 1}, + {0x124u, {0x125u, 0x0u, 0x0u}, 1}, + {0x126u, {0x127u, 0x0u, 0x0u}, 1}, + {0x128u, {0x129u, 0x0u, 0x0u}, 1}, + {0x12au, {0x12bu, 0x0u, 0x0u}, 1}, + {0x12cu, {0x12du, 0x0u, 0x0u}, 1}, + {0x12eu, {0x12fu, 0x0u, 0x0u}, 1}, + {0x130u, {0x69u, 0x307u, 0x0u}, 2}, + {0x132u, {0x133u, 0x0u, 0x0u}, 1}, + {0x134u, {0x135u, 0x0u, 0x0u}, 1}, + {0x136u, {0x137u, 0x0u, 0x0u}, 1}, + {0x139u, {0x13au, 0x0u, 0x0u}, 1}, + {0x13bu, {0x13cu, 0x0u, 0x0u}, 1}, + {0x13du, {0x13eu, 0x0u, 0x0u}, 1}, + {0x13fu, {0x140u, 0x0u, 0x0u}, 1}, + {0x141u, {0x142u, 0x0u, 0x0u}, 1}, + {0x143u, {0x144u, 0x0u, 0x0u}, 1}, + {0x145u, {0x146u, 0x0u, 0x0u}, 1}, + {0x147u, {0x148u, 0x0u, 0x0u}, 1}, + {0x14au, {0x14bu, 0x0u, 0x0u}, 1}, + {0x14cu, {0x14du, 0x0u, 0x0u}, 1}, + {0x14eu, {0x14fu, 0x0u, 0x0u}, 1}, + {0x150u, {0x151u, 0x0u, 0x0u}, 1}, + {0x152u, {0x153u, 0x0u, 0x0u}, 1}, + {0x154u, {0x155u, 0x0u, 0x0u}, 1}, + {0x156u, {0x157u, 0x0u, 0x0u}, 1}, + {0x158u, {0x159u, 0x0u, 0x0u}, 1}, + {0x15au, {0x15bu, 0x0u, 0x0u}, 1}, + {0x15cu, {0x15du, 0x0u, 0x0u}, 1}, + {0x15eu, {0x15fu, 0x0u, 0x0u}, 1}, + {0x160u, {0x161u, 0x0u, 0x0u}, 1}, + {0x162u, {0x163u, 0x0u, 0x0u}, 1}, + {0x164u, {0x165u, 0x0u, 0x0u}, 1}, + {0x166u, {0x167u, 0x0u, 0x0u}, 1}, + {0x168u, {0x169u, 0x0u, 0x0u}, 1}, + {0x16au, {0x16bu, 0x0u, 0x0u}, 1}, + {0x16cu, {0x16du, 0x0u, 0x0u}, 1}, + {0x16eu, {0x16fu, 0x0u, 0x0u}, 1}, + {0x170u, {0x171u, 0x0u, 0x0u}, 1}, + {0x172u, {0x173u, 0x0u, 0x0u}, 1}, + {0x174u, {0x175u, 0x0u, 0x0u}, 1}, + {0x176u, {0x177u, 0x0u, 0x0u}, 1}, + {0x178u, {0xffu, 0x0u, 0x0u}, 1}, + {0x179u, {0x17au, 0x0u, 0x0u}, 1}, + {0x17bu, {0x17cu, 0x0u, 0x0u}, 1}, + {0x17du, {0x17eu, 0x0u, 0x0u}, 1}, + {0x181u, {0x253u, 0x0u, 0x0u}, 1}, + {0x182u, {0x183u, 0x0u, 0x0u}, 1}, + {0x184u, {0x185u, 0x0u, 0x0u}, 1}, + {0x186u, {0x254u, 0x0u, 0x0u}, 1}, + {0x187u, {0x188u, 0x0u, 0x0u}, 1}, + {0x189u, {0x256u, 0x0u, 0x0u}, 1}, + {0x18au, {0x257u, 0x0u, 0x0u}, 1}, + {0x18bu, {0x18cu, 0x0u, 0x0u}, 1}, + {0x18eu, {0x1ddu, 0x0u, 0x0u}, 1}, + {0x18fu, {0x259u, 0x0u, 0x0u}, 1}, + {0x190u, {0x25bu, 0x0u, 0x0u}, 1}, + {0x191u, {0x192u, 0x0u, 0x0u}, 1}, + {0x193u, {0x260u, 0x0u, 0x0u}, 1}, + {0x194u, {0x263u, 0x0u, 0x0u}, 1}, + {0x196u, {0x269u, 0x0u, 0x0u}, 1}, + {0x197u, {0x268u, 0x0u, 0x0u}, 1}, + {0x198u, {0x199u, 0x0u, 0x0u}, 1}, + {0x19cu, {0x26fu, 0x0u, 0x0u}, 1}, + {0x19du, {0x272u, 0x0u, 0x0u}, 1}, + {0x19fu, {0x275u, 0x0u, 0x0u}, 1}, + {0x1a0u, {0x1a1u, 0x0u, 0x0u}, 1}, + {0x1a2u, {0x1a3u, 0x0u, 0x0u}, 1}, + {0x1a4u, {0x1a5u, 0x0u, 0x0u}, 1}, + {0x1a6u, {0x280u, 0x0u, 0x0u}, 1}, + {0x1a7u, {0x1a8u, 0x0u, 0x0u}, 1}, + {0x1a9u, {0x283u, 0x0u, 0x0u}, 1}, + {0x1acu, {0x1adu, 0x0u, 0x0u}, 1}, + {0x1aeu, {0x288u, 0x0u, 0x0u}, 1}, + {0x1afu, {0x1b0u, 0x0u, 0x0u}, 1}, + {0x1b1u, {0x28au, 0x0u, 0x0u}, 1}, + {0x1b2u, {0x28bu, 0x0u, 0x0u}, 1}, + {0x1b3u, {0x1b4u, 0x0u, 0x0u}, 1}, + {0x1b5u, {0x1b6u, 0x0u, 0x0u}, 1}, + {0x1b7u, {0x292u, 0x0u, 0x0u}, 1}, + {0x1b8u, {0x1b9u, 0x0u, 0x0u}, 1}, + {0x1bcu, {0x1bdu, 0x0u, 0x0u}, 1}, + {0x1c4u, {0x1c6u, 0x0u, 0x0u}, 1}, + {0x1c5u, {0x1c6u, 0x0u, 0x0u}, 1}, + {0x1c7u, {0x1c9u, 0x0u, 0x0u}, 1}, + {0x1c8u, {0x1c9u, 0x0u, 0x0u}, 1}, + {0x1cau, {0x1ccu, 0x0u, 0x0u}, 1}, + {0x1cbu, {0x1ccu, 0x0u, 0x0u}, 1}, + {0x1cdu, {0x1ceu, 0x0u, 0x0u}, 1}, + {0x1cfu, {0x1d0u, 0x0u, 0x0u}, 1}, + {0x1d1u, {0x1d2u, 0x0u, 0x0u}, 1}, + {0x1d3u, {0x1d4u, 0x0u, 0x0u}, 1}, + {0x1d5u, {0x1d6u, 0x0u, 0x0u}, 1}, + {0x1d7u, {0x1d8u, 0x0u, 0x0u}, 1}, + {0x1d9u, {0x1dau, 0x0u, 0x0u}, 1}, + {0x1dbu, {0x1dcu, 0x0u, 0x0u}, 1}, + {0x1deu, {0x1dfu, 0x0u, 0x0u}, 1}, + {0x1e0u, {0x1e1u, 0x0u, 0x0u}, 1}, + {0x1e2u, {0x1e3u, 0x0u, 0x0u}, 1}, + {0x1e4u, {0x1e5u, 0x0u, 0x0u}, 1}, + {0x1e6u, {0x1e7u, 0x0u, 0x0u}, 1}, + {0x1e8u, {0x1e9u, 0x0u, 0x0u}, 1}, + {0x1eau, {0x1ebu, 0x0u, 0x0u}, 1}, + {0x1ecu, {0x1edu, 0x0u, 0x0u}, 1}, + {0x1eeu, {0x1efu, 0x0u, 0x0u}, 1}, + {0x1f1u, {0x1f3u, 0x0u, 0x0u}, 1}, + {0x1f2u, {0x1f3u, 0x0u, 0x0u}, 1}, + {0x1f4u, {0x1f5u, 0x0u, 0x0u}, 1}, + {0x1f6u, {0x195u, 0x0u, 0x0u}, 1}, + {0x1f7u, {0x1bfu, 0x0u, 0x0u}, 1}, + {0x1f8u, {0x1f9u, 0x0u, 0x0u}, 1}, + {0x1fau, {0x1fbu, 0x0u, 0x0u}, 1}, + {0x1fcu, {0x1fdu, 0x0u, 0x0u}, 1}, + {0x1feu, {0x1ffu, 0x0u, 0x0u}, 1}, + {0x200u, {0x201u, 0x0u, 0x0u}, 1}, + {0x202u, {0x203u, 0x0u, 0x0u}, 1}, + {0x204u, {0x205u, 0x0u, 0x0u}, 1}, + {0x206u, {0x207u, 0x0u, 0x0u}, 1}, + {0x208u, {0x209u, 0x0u, 0x0u}, 1}, + {0x20au, {0x20bu, 0x0u, 0x0u}, 1}, + {0x20cu, {0x20du, 0x0u, 0x0u}, 1}, + {0x20eu, {0x20fu, 0x0u, 0x0u}, 1}, + {0x210u, {0x211u, 0x0u, 0x0u}, 1}, + {0x212u, {0x213u, 0x0u, 0x0u}, 1}, + {0x214u, {0x215u, 0x0u, 0x0u}, 1}, + {0x216u, {0x217u, 0x0u, 0x0u}, 1}, + {0x218u, {0x219u, 0x0u, 0x0u}, 1}, + {0x21au, {0x21bu, 0x0u, 0x0u}, 1}, + {0x21cu, {0x21du, 0x0u, 0x0u}, 1}, + {0x21eu, {0x21fu, 0x0u, 0x0u}, 1}, + {0x220u, {0x19eu, 0x0u, 0x0u}, 1}, + {0x222u, {0x223u, 0x0u, 0x0u}, 1}, + {0x224u, {0x225u, 0x0u, 0x0u}, 1}, + {0x226u, {0x227u, 0x0u, 0x0u}, 1}, + {0x228u, {0x229u, 0x0u, 0x0u}, 1}, + {0x22au, {0x22bu, 0x0u, 0x0u}, 1}, + {0x22cu, {0x22du, 0x0u, 0x0u}, 1}, + {0x22eu, {0x22fu, 0x0u, 0x0u}, 1}, + {0x230u, {0x231u, 0x0u, 0x0u}, 1}, + {0x232u, {0x233u, 0x0u, 0x0u}, 1}, + {0x23au, {0x2c65u, 0x0u, 0x0u}, 1}, + {0x23bu, {0x23cu, 0x0u, 0x0u}, 1}, + {0x23du, {0x19au, 0x0u, 0x0u}, 1}, + {0x23eu, {0x2c66u, 0x0u, 0x0u}, 1}, + {0x241u, {0x242u, 0x0u, 0x0u}, 1}, + {0x243u, {0x180u, 0x0u, 0x0u}, 1}, + {0x244u, {0x289u, 0x0u, 0x0u}, 1}, + {0x245u, {0x28cu, 0x0u, 0x0u}, 1}, + {0x246u, {0x247u, 0x0u, 0x0u}, 1}, + {0x248u, {0x249u, 0x0u, 0x0u}, 1}, + {0x24au, {0x24bu, 0x0u, 0x0u}, 1}, + {0x24cu, {0x24du, 0x0u, 0x0u}, 1}, + {0x24eu, {0x24fu, 0x0u, 0x0u}, 1}, + {0x370u, {0x371u, 0x0u, 0x0u}, 1}, + {0x372u, {0x373u, 0x0u, 0x0u}, 1}, + {0x376u, {0x377u, 0x0u, 0x0u}, 1}, + {0x37fu, {0x3f3u, 0x0u, 0x0u}, 1}, + {0x386u, {0x3acu, 0x0u, 0x0u}, 1}, + {0x388u, {0x3adu, 0x0u, 0x0u}, 1}, + {0x389u, {0x3aeu, 0x0u, 0x0u}, 1}, + {0x38au, {0x3afu, 0x0u, 0x0u}, 1}, + {0x38cu, {0x3ccu, 0x0u, 0x0u}, 1}, + {0x38eu, {0x3cdu, 0x0u, 0x0u}, 1}, + {0x38fu, {0x3ceu, 0x0u, 0x0u}, 1}, + {0x391u, {0x3b1u, 0x0u, 0x0u}, 1}, + {0x392u, {0x3b2u, 0x0u, 0x0u}, 1}, + {0x393u, {0x3b3u, 0x0u, 0x0u}, 1}, + {0x394u, {0x3b4u, 0x0u, 0x0u}, 1}, + {0x395u, {0x3b5u, 0x0u, 0x0u}, 1}, + {0x396u, {0x3b6u, 0x0u, 0x0u}, 1}, + {0x397u, {0x3b7u, 0x0u, 0x0u}, 1}, + {0x398u, {0x3b8u, 0x0u, 0x0u}, 1}, + {0x399u, {0x3b9u, 0x0u, 0x0u}, 1}, + {0x39au, {0x3bau, 0x0u, 0x0u}, 1}, + {0x39bu, {0x3bbu, 0x0u, 0x0u}, 1}, + {0x39cu, {0x3bcu, 0x0u, 0x0u}, 1}, + {0x39du, {0x3bdu, 0x0u, 0x0u}, 1}, + {0x39eu, {0x3beu, 0x0u, 0x0u}, 1}, + {0x39fu, {0x3bfu, 0x0u, 0x0u}, 1}, + {0x3a0u, {0x3c0u, 0x0u, 0x0u}, 1}, + {0x3a1u, {0x3c1u, 0x0u, 0x0u}, 1}, + {0x3a3u, {0x3c3u, 0x0u, 0x0u}, 1}, + {0x3a4u, {0x3c4u, 0x0u, 0x0u}, 1}, + {0x3a5u, {0x3c5u, 0x0u, 0x0u}, 1}, + {0x3a6u, {0x3c6u, 0x0u, 0x0u}, 1}, + {0x3a7u, {0x3c7u, 0x0u, 0x0u}, 1}, + {0x3a8u, {0x3c8u, 0x0u, 0x0u}, 1}, + {0x3a9u, {0x3c9u, 0x0u, 0x0u}, 1}, + {0x3aau, {0x3cau, 0x0u, 0x0u}, 1}, + {0x3abu, {0x3cbu, 0x0u, 0x0u}, 1}, + {0x3cfu, {0x3d7u, 0x0u, 0x0u}, 1}, + {0x3d8u, {0x3d9u, 0x0u, 0x0u}, 1}, + {0x3dau, {0x3dbu, 0x0u, 0x0u}, 1}, + {0x3dcu, {0x3ddu, 0x0u, 0x0u}, 1}, + {0x3deu, {0x3dfu, 0x0u, 0x0u}, 1}, + {0x3e0u, {0x3e1u, 0x0u, 0x0u}, 1}, + {0x3e2u, {0x3e3u, 0x0u, 0x0u}, 1}, + {0x3e4u, {0x3e5u, 0x0u, 0x0u}, 1}, + {0x3e6u, {0x3e7u, 0x0u, 0x0u}, 1}, + {0x3e8u, {0x3e9u, 0x0u, 0x0u}, 1}, + {0x3eau, {0x3ebu, 0x0u, 0x0u}, 1}, + {0x3ecu, {0x3edu, 0x0u, 0x0u}, 1}, + {0x3eeu, {0x3efu, 0x0u, 0x0u}, 1}, + {0x3f4u, {0x3b8u, 0x0u, 0x0u}, 1}, + {0x3f7u, {0x3f8u, 0x0u, 0x0u}, 1}, + {0x3f9u, {0x3f2u, 0x0u, 0x0u}, 1}, + {0x3fau, {0x3fbu, 0x0u, 0x0u}, 1}, + {0x3fdu, {0x37bu, 0x0u, 0x0u}, 1}, + {0x3feu, {0x37cu, 0x0u, 0x0u}, 1}, + {0x3ffu, {0x37du, 0x0u, 0x0u}, 1}, + {0x400u, {0x450u, 0x0u, 0x0u}, 1}, + {0x401u, {0x451u, 0x0u, 0x0u}, 1}, + {0x402u, {0x452u, 0x0u, 0x0u}, 1}, + {0x403u, {0x453u, 0x0u, 0x0u}, 1}, + {0x404u, {0x454u, 0x0u, 0x0u}, 1}, + {0x405u, {0x455u, 0x0u, 0x0u}, 1}, + {0x406u, {0x456u, 0x0u, 0x0u}, 1}, + {0x407u, {0x457u, 0x0u, 0x0u}, 1}, + {0x408u, {0x458u, 0x0u, 0x0u}, 1}, + {0x409u, {0x459u, 0x0u, 0x0u}, 1}, + {0x40au, {0x45au, 0x0u, 0x0u}, 1}, + {0x40bu, {0x45bu, 0x0u, 0x0u}, 1}, + {0x40cu, {0x45cu, 0x0u, 0x0u}, 1}, + {0x40du, {0x45du, 0x0u, 0x0u}, 1}, + {0x40eu, {0x45eu, 0x0u, 0x0u}, 1}, + {0x40fu, {0x45fu, 0x0u, 0x0u}, 1}, + {0x410u, {0x430u, 0x0u, 0x0u}, 1}, + {0x411u, {0x431u, 0x0u, 0x0u}, 1}, + {0x412u, {0x432u, 0x0u, 0x0u}, 1}, + {0x413u, {0x433u, 0x0u, 0x0u}, 1}, + {0x414u, {0x434u, 0x0u, 0x0u}, 1}, + {0x415u, {0x435u, 0x0u, 0x0u}, 1}, + {0x416u, {0x436u, 0x0u, 0x0u}, 1}, + {0x417u, {0x437u, 0x0u, 0x0u}, 1}, + {0x418u, {0x438u, 0x0u, 0x0u}, 1}, + {0x419u, {0x439u, 0x0u, 0x0u}, 1}, + {0x41au, {0x43au, 0x0u, 0x0u}, 1}, + {0x41bu, {0x43bu, 0x0u, 0x0u}, 1}, + {0x41cu, {0x43cu, 0x0u, 0x0u}, 1}, + {0x41du, {0x43du, 0x0u, 0x0u}, 1}, + {0x41eu, {0x43eu, 0x0u, 0x0u}, 1}, + {0x41fu, {0x43fu, 0x0u, 0x0u}, 1}, + {0x420u, {0x440u, 0x0u, 0x0u}, 1}, + {0x421u, {0x441u, 0x0u, 0x0u}, 1}, + {0x422u, {0x442u, 0x0u, 0x0u}, 1}, + {0x423u, {0x443u, 0x0u, 0x0u}, 1}, + {0x424u, {0x444u, 0x0u, 0x0u}, 1}, + {0x425u, {0x445u, 0x0u, 0x0u}, 1}, + {0x426u, {0x446u, 0x0u, 0x0u}, 1}, + {0x427u, {0x447u, 0x0u, 0x0u}, 1}, + {0x428u, {0x448u, 0x0u, 0x0u}, 1}, + {0x429u, {0x449u, 0x0u, 0x0u}, 1}, + {0x42au, {0x44au, 0x0u, 0x0u}, 1}, + {0x42bu, {0x44bu, 0x0u, 0x0u}, 1}, + {0x42cu, {0x44cu, 0x0u, 0x0u}, 1}, + {0x42du, {0x44du, 0x0u, 0x0u}, 1}, + {0x42eu, {0x44eu, 0x0u, 0x0u}, 1}, + {0x42fu, {0x44fu, 0x0u, 0x0u}, 1}, + {0x460u, {0x461u, 0x0u, 0x0u}, 1}, + {0x462u, {0x463u, 0x0u, 0x0u}, 1}, + {0x464u, {0x465u, 0x0u, 0x0u}, 1}, + {0x466u, {0x467u, 0x0u, 0x0u}, 1}, + {0x468u, {0x469u, 0x0u, 0x0u}, 1}, + {0x46au, {0x46bu, 0x0u, 0x0u}, 1}, + {0x46cu, {0x46du, 0x0u, 0x0u}, 1}, + {0x46eu, {0x46fu, 0x0u, 0x0u}, 1}, + {0x470u, {0x471u, 0x0u, 0x0u}, 1}, + {0x472u, {0x473u, 0x0u, 0x0u}, 1}, + {0x474u, {0x475u, 0x0u, 0x0u}, 1}, + {0x476u, {0x477u, 0x0u, 0x0u}, 1}, + {0x478u, {0x479u, 0x0u, 0x0u}, 1}, + {0x47au, {0x47bu, 0x0u, 0x0u}, 1}, + {0x47cu, {0x47du, 0x0u, 0x0u}, 1}, + {0x47eu, {0x47fu, 0x0u, 0x0u}, 1}, + {0x480u, {0x481u, 0x0u, 0x0u}, 1}, + {0x48au, {0x48bu, 0x0u, 0x0u}, 1}, + {0x48cu, {0x48du, 0x0u, 0x0u}, 1}, + {0x48eu, {0x48fu, 0x0u, 0x0u}, 1}, + {0x490u, {0x491u, 0x0u, 0x0u}, 1}, + {0x492u, {0x493u, 0x0u, 0x0u}, 1}, + {0x494u, {0x495u, 0x0u, 0x0u}, 1}, + {0x496u, {0x497u, 0x0u, 0x0u}, 1}, + {0x498u, {0x499u, 0x0u, 0x0u}, 1}, + {0x49au, {0x49bu, 0x0u, 0x0u}, 1}, + {0x49cu, {0x49du, 0x0u, 0x0u}, 1}, + {0x49eu, {0x49fu, 0x0u, 0x0u}, 1}, + {0x4a0u, {0x4a1u, 0x0u, 0x0u}, 1}, + {0x4a2u, {0x4a3u, 0x0u, 0x0u}, 1}, + {0x4a4u, {0x4a5u, 0x0u, 0x0u}, 1}, + {0x4a6u, {0x4a7u, 0x0u, 0x0u}, 1}, + {0x4a8u, {0x4a9u, 0x0u, 0x0u}, 1}, + {0x4aau, {0x4abu, 0x0u, 0x0u}, 1}, + {0x4acu, {0x4adu, 0x0u, 0x0u}, 1}, + {0x4aeu, {0x4afu, 0x0u, 0x0u}, 1}, + {0x4b0u, {0x4b1u, 0x0u, 0x0u}, 1}, + {0x4b2u, {0x4b3u, 0x0u, 0x0u}, 1}, + {0x4b4u, {0x4b5u, 0x0u, 0x0u}, 1}, + {0x4b6u, {0x4b7u, 0x0u, 0x0u}, 1}, + {0x4b8u, {0x4b9u, 0x0u, 0x0u}, 1}, + {0x4bau, {0x4bbu, 0x0u, 0x0u}, 1}, + {0x4bcu, {0x4bdu, 0x0u, 0x0u}, 1}, + {0x4beu, {0x4bfu, 0x0u, 0x0u}, 1}, + {0x4c0u, {0x4cfu, 0x0u, 0x0u}, 1}, + {0x4c1u, {0x4c2u, 0x0u, 0x0u}, 1}, + {0x4c3u, {0x4c4u, 0x0u, 0x0u}, 1}, + {0x4c5u, {0x4c6u, 0x0u, 0x0u}, 1}, + {0x4c7u, {0x4c8u, 0x0u, 0x0u}, 1}, + {0x4c9u, {0x4cau, 0x0u, 0x0u}, 1}, + {0x4cbu, {0x4ccu, 0x0u, 0x0u}, 1}, + {0x4cdu, {0x4ceu, 0x0u, 0x0u}, 1}, + {0x4d0u, {0x4d1u, 0x0u, 0x0u}, 1}, + {0x4d2u, {0x4d3u, 0x0u, 0x0u}, 1}, + {0x4d4u, {0x4d5u, 0x0u, 0x0u}, 1}, + {0x4d6u, {0x4d7u, 0x0u, 0x0u}, 1}, + {0x4d8u, {0x4d9u, 0x0u, 0x0u}, 1}, + {0x4dau, {0x4dbu, 0x0u, 0x0u}, 1}, + {0x4dcu, {0x4ddu, 0x0u, 0x0u}, 1}, + {0x4deu, {0x4dfu, 0x0u, 0x0u}, 1}, + {0x4e0u, {0x4e1u, 0x0u, 0x0u}, 1}, + {0x4e2u, {0x4e3u, 0x0u, 0x0u}, 1}, + {0x4e4u, {0x4e5u, 0x0u, 0x0u}, 1}, + {0x4e6u, {0x4e7u, 0x0u, 0x0u}, 1}, + {0x4e8u, {0x4e9u, 0x0u, 0x0u}, 1}, + {0x4eau, {0x4ebu, 0x0u, 0x0u}, 1}, + {0x4ecu, {0x4edu, 0x0u, 0x0u}, 1}, + {0x4eeu, {0x4efu, 0x0u, 0x0u}, 1}, + {0x4f0u, {0x4f1u, 0x0u, 0x0u}, 1}, + {0x4f2u, {0x4f3u, 0x0u, 0x0u}, 1}, + {0x4f4u, {0x4f5u, 0x0u, 0x0u}, 1}, + {0x4f6u, {0x4f7u, 0x0u, 0x0u}, 1}, + {0x4f8u, {0x4f9u, 0x0u, 0x0u}, 1}, + {0x4fau, {0x4fbu, 0x0u, 0x0u}, 1}, + {0x4fcu, {0x4fdu, 0x0u, 0x0u}, 1}, + {0x4feu, {0x4ffu, 0x0u, 0x0u}, 1}, + {0x500u, {0x501u, 0x0u, 0x0u}, 1}, + {0x502u, {0x503u, 0x0u, 0x0u}, 1}, + {0x504u, {0x505u, 0x0u, 0x0u}, 1}, + {0x506u, {0x507u, 0x0u, 0x0u}, 1}, + {0x508u, {0x509u, 0x0u, 0x0u}, 1}, + {0x50au, {0x50bu, 0x0u, 0x0u}, 1}, + {0x50cu, {0x50du, 0x0u, 0x0u}, 1}, + {0x50eu, {0x50fu, 0x0u, 0x0u}, 1}, + {0x510u, {0x511u, 0x0u, 0x0u}, 1}, + {0x512u, {0x513u, 0x0u, 0x0u}, 1}, + {0x514u, {0x515u, 0x0u, 0x0u}, 1}, + {0x516u, {0x517u, 0x0u, 0x0u}, 1}, + {0x518u, {0x519u, 0x0u, 0x0u}, 1}, + {0x51au, {0x51bu, 0x0u, 0x0u}, 1}, + {0x51cu, {0x51du, 0x0u, 0x0u}, 1}, + {0x51eu, {0x51fu, 0x0u, 0x0u}, 1}, + {0x520u, {0x521u, 0x0u, 0x0u}, 1}, + {0x522u, {0x523u, 0x0u, 0x0u}, 1}, + {0x524u, {0x525u, 0x0u, 0x0u}, 1}, + {0x526u, {0x527u, 0x0u, 0x0u}, 1}, + {0x528u, {0x529u, 0x0u, 0x0u}, 1}, + {0x52au, {0x52bu, 0x0u, 0x0u}, 1}, + {0x52cu, {0x52du, 0x0u, 0x0u}, 1}, + {0x52eu, {0x52fu, 0x0u, 0x0u}, 1}, + {0x531u, {0x561u, 0x0u, 0x0u}, 1}, + {0x532u, {0x562u, 0x0u, 0x0u}, 1}, + {0x533u, {0x563u, 0x0u, 0x0u}, 1}, + {0x534u, {0x564u, 0x0u, 0x0u}, 1}, + {0x535u, {0x565u, 0x0u, 0x0u}, 1}, + {0x536u, {0x566u, 0x0u, 0x0u}, 1}, + {0x537u, {0x567u, 0x0u, 0x0u}, 1}, + {0x538u, {0x568u, 0x0u, 0x0u}, 1}, + {0x539u, {0x569u, 0x0u, 0x0u}, 1}, + {0x53au, {0x56au, 0x0u, 0x0u}, 1}, + {0x53bu, {0x56bu, 0x0u, 0x0u}, 1}, + {0x53cu, {0x56cu, 0x0u, 0x0u}, 1}, + {0x53du, {0x56du, 0x0u, 0x0u}, 1}, + {0x53eu, {0x56eu, 0x0u, 0x0u}, 1}, + {0x53fu, {0x56fu, 0x0u, 0x0u}, 1}, + {0x540u, {0x570u, 0x0u, 0x0u}, 1}, + {0x541u, {0x571u, 0x0u, 0x0u}, 1}, + {0x542u, {0x572u, 0x0u, 0x0u}, 1}, + {0x543u, {0x573u, 0x0u, 0x0u}, 1}, + {0x544u, {0x574u, 0x0u, 0x0u}, 1}, + {0x545u, {0x575u, 0x0u, 0x0u}, 1}, + {0x546u, {0x576u, 0x0u, 0x0u}, 1}, + {0x547u, {0x577u, 0x0u, 0x0u}, 1}, + {0x548u, {0x578u, 0x0u, 0x0u}, 1}, + {0x549u, {0x579u, 0x0u, 0x0u}, 1}, + {0x54au, {0x57au, 0x0u, 0x0u}, 1}, + {0x54bu, {0x57bu, 0x0u, 0x0u}, 1}, + {0x54cu, {0x57cu, 0x0u, 0x0u}, 1}, + {0x54du, {0x57du, 0x0u, 0x0u}, 1}, + {0x54eu, {0x57eu, 0x0u, 0x0u}, 1}, + {0x54fu, {0x57fu, 0x0u, 0x0u}, 1}, + {0x550u, {0x580u, 0x0u, 0x0u}, 1}, + {0x551u, {0x581u, 0x0u, 0x0u}, 1}, + {0x552u, {0x582u, 0x0u, 0x0u}, 1}, + {0x553u, {0x583u, 0x0u, 0x0u}, 1}, + {0x554u, {0x584u, 0x0u, 0x0u}, 1}, + {0x555u, {0x585u, 0x0u, 0x0u}, 1}, + {0x556u, {0x586u, 0x0u, 0x0u}, 1}, + {0x10a0u, {0x2d00u, 0x0u, 0x0u}, 1}, + {0x10a1u, {0x2d01u, 0x0u, 0x0u}, 1}, + {0x10a2u, {0x2d02u, 0x0u, 0x0u}, 1}, + {0x10a3u, {0x2d03u, 0x0u, 0x0u}, 1}, + {0x10a4u, {0x2d04u, 0x0u, 0x0u}, 1}, + {0x10a5u, {0x2d05u, 0x0u, 0x0u}, 1}, + {0x10a6u, {0x2d06u, 0x0u, 0x0u}, 1}, + {0x10a7u, {0x2d07u, 0x0u, 0x0u}, 1}, + {0x10a8u, {0x2d08u, 0x0u, 0x0u}, 1}, + {0x10a9u, {0x2d09u, 0x0u, 0x0u}, 1}, + {0x10aau, {0x2d0au, 0x0u, 0x0u}, 1}, + {0x10abu, {0x2d0bu, 0x0u, 0x0u}, 1}, + {0x10acu, {0x2d0cu, 0x0u, 0x0u}, 1}, + {0x10adu, {0x2d0du, 0x0u, 0x0u}, 1}, + {0x10aeu, {0x2d0eu, 0x0u, 0x0u}, 1}, + {0x10afu, {0x2d0fu, 0x0u, 0x0u}, 1}, + {0x10b0u, {0x2d10u, 0x0u, 0x0u}, 1}, + {0x10b1u, {0x2d11u, 0x0u, 0x0u}, 1}, + {0x10b2u, {0x2d12u, 0x0u, 0x0u}, 1}, + {0x10b3u, {0x2d13u, 0x0u, 0x0u}, 1}, + {0x10b4u, {0x2d14u, 0x0u, 0x0u}, 1}, + {0x10b5u, {0x2d15u, 0x0u, 0x0u}, 1}, + {0x10b6u, {0x2d16u, 0x0u, 0x0u}, 1}, + {0x10b7u, {0x2d17u, 0x0u, 0x0u}, 1}, + {0x10b8u, {0x2d18u, 0x0u, 0x0u}, 1}, + {0x10b9u, {0x2d19u, 0x0u, 0x0u}, 1}, + {0x10bau, {0x2d1au, 0x0u, 0x0u}, 1}, + {0x10bbu, {0x2d1bu, 0x0u, 0x0u}, 1}, + {0x10bcu, {0x2d1cu, 0x0u, 0x0u}, 1}, + {0x10bdu, {0x2d1du, 0x0u, 0x0u}, 1}, + {0x10beu, {0x2d1eu, 0x0u, 0x0u}, 1}, + {0x10bfu, {0x2d1fu, 0x0u, 0x0u}, 1}, + {0x10c0u, {0x2d20u, 0x0u, 0x0u}, 1}, + {0x10c1u, {0x2d21u, 0x0u, 0x0u}, 1}, + {0x10c2u, {0x2d22u, 0x0u, 0x0u}, 1}, + {0x10c3u, {0x2d23u, 0x0u, 0x0u}, 1}, + {0x10c4u, {0x2d24u, 0x0u, 0x0u}, 1}, + {0x10c5u, {0x2d25u, 0x0u, 0x0u}, 1}, + {0x10c7u, {0x2d27u, 0x0u, 0x0u}, 1}, + {0x10cdu, {0x2d2du, 0x0u, 0x0u}, 1}, + {0x13a0u, {0xab70u, 0x0u, 0x0u}, 1}, + {0x13a1u, {0xab71u, 0x0u, 0x0u}, 1}, + {0x13a2u, {0xab72u, 0x0u, 0x0u}, 1}, + {0x13a3u, {0xab73u, 0x0u, 0x0u}, 1}, + {0x13a4u, {0xab74u, 0x0u, 0x0u}, 1}, + {0x13a5u, {0xab75u, 0x0u, 0x0u}, 1}, + {0x13a6u, {0xab76u, 0x0u, 0x0u}, 1}, + {0x13a7u, {0xab77u, 0x0u, 0x0u}, 1}, + {0x13a8u, {0xab78u, 0x0u, 0x0u}, 1}, + {0x13a9u, {0xab79u, 0x0u, 0x0u}, 1}, + {0x13aau, {0xab7au, 0x0u, 0x0u}, 1}, + {0x13abu, {0xab7bu, 0x0u, 0x0u}, 1}, + {0x13acu, {0xab7cu, 0x0u, 0x0u}, 1}, + {0x13adu, {0xab7du, 0x0u, 0x0u}, 1}, + {0x13aeu, {0xab7eu, 0x0u, 0x0u}, 1}, + {0x13afu, {0xab7fu, 0x0u, 0x0u}, 1}, + {0x13b0u, {0xab80u, 0x0u, 0x0u}, 1}, + {0x13b1u, {0xab81u, 0x0u, 0x0u}, 1}, + {0x13b2u, {0xab82u, 0x0u, 0x0u}, 1}, + {0x13b3u, {0xab83u, 0x0u, 0x0u}, 1}, + {0x13b4u, {0xab84u, 0x0u, 0x0u}, 1}, + {0x13b5u, {0xab85u, 0x0u, 0x0u}, 1}, + {0x13b6u, {0xab86u, 0x0u, 0x0u}, 1}, + {0x13b7u, {0xab87u, 0x0u, 0x0u}, 1}, + {0x13b8u, {0xab88u, 0x0u, 0x0u}, 1}, + {0x13b9u, {0xab89u, 0x0u, 0x0u}, 1}, + {0x13bau, {0xab8au, 0x0u, 0x0u}, 1}, + {0x13bbu, {0xab8bu, 0x0u, 0x0u}, 1}, + {0x13bcu, {0xab8cu, 0x0u, 0x0u}, 1}, + {0x13bdu, {0xab8du, 0x0u, 0x0u}, 1}, + {0x13beu, {0xab8eu, 0x0u, 0x0u}, 1}, + {0x13bfu, {0xab8fu, 0x0u, 0x0u}, 1}, + {0x13c0u, {0xab90u, 0x0u, 0x0u}, 1}, + {0x13c1u, {0xab91u, 0x0u, 0x0u}, 1}, + {0x13c2u, {0xab92u, 0x0u, 0x0u}, 1}, + {0x13c3u, {0xab93u, 0x0u, 0x0u}, 1}, + {0x13c4u, {0xab94u, 0x0u, 0x0u}, 1}, + {0x13c5u, {0xab95u, 0x0u, 0x0u}, 1}, + {0x13c6u, {0xab96u, 0x0u, 0x0u}, 1}, + {0x13c7u, {0xab97u, 0x0u, 0x0u}, 1}, + {0x13c8u, {0xab98u, 0x0u, 0x0u}, 1}, + {0x13c9u, {0xab99u, 0x0u, 0x0u}, 1}, + {0x13cau, {0xab9au, 0x0u, 0x0u}, 1}, + {0x13cbu, {0xab9bu, 0x0u, 0x0u}, 1}, + {0x13ccu, {0xab9cu, 0x0u, 0x0u}, 1}, + {0x13cdu, {0xab9du, 0x0u, 0x0u}, 1}, + {0x13ceu, {0xab9eu, 0x0u, 0x0u}, 1}, + {0x13cfu, {0xab9fu, 0x0u, 0x0u}, 1}, + {0x13d0u, {0xaba0u, 0x0u, 0x0u}, 1}, + {0x13d1u, {0xaba1u, 0x0u, 0x0u}, 1}, + {0x13d2u, {0xaba2u, 0x0u, 0x0u}, 1}, + {0x13d3u, {0xaba3u, 0x0u, 0x0u}, 1}, + {0x13d4u, {0xaba4u, 0x0u, 0x0u}, 1}, + {0x13d5u, {0xaba5u, 0x0u, 0x0u}, 1}, + {0x13d6u, {0xaba6u, 0x0u, 0x0u}, 1}, + {0x13d7u, {0xaba7u, 0x0u, 0x0u}, 1}, + {0x13d8u, {0xaba8u, 0x0u, 0x0u}, 1}, + {0x13d9u, {0xaba9u, 0x0u, 0x0u}, 1}, + {0x13dau, {0xabaau, 0x0u, 0x0u}, 1}, + {0x13dbu, {0xababu, 0x0u, 0x0u}, 1}, + {0x13dcu, {0xabacu, 0x0u, 0x0u}, 1}, + {0x13ddu, {0xabadu, 0x0u, 0x0u}, 1}, + {0x13deu, {0xabaeu, 0x0u, 0x0u}, 1}, + {0x13dfu, {0xabafu, 0x0u, 0x0u}, 1}, + {0x13e0u, {0xabb0u, 0x0u, 0x0u}, 1}, + {0x13e1u, {0xabb1u, 0x0u, 0x0u}, 1}, + {0x13e2u, {0xabb2u, 0x0u, 0x0u}, 1}, + {0x13e3u, {0xabb3u, 0x0u, 0x0u}, 1}, + {0x13e4u, {0xabb4u, 0x0u, 0x0u}, 1}, + {0x13e5u, {0xabb5u, 0x0u, 0x0u}, 1}, + {0x13e6u, {0xabb6u, 0x0u, 0x0u}, 1}, + {0x13e7u, {0xabb7u, 0x0u, 0x0u}, 1}, + {0x13e8u, {0xabb8u, 0x0u, 0x0u}, 1}, + {0x13e9u, {0xabb9u, 0x0u, 0x0u}, 1}, + {0x13eau, {0xabbau, 0x0u, 0x0u}, 1}, + {0x13ebu, {0xabbbu, 0x0u, 0x0u}, 1}, + {0x13ecu, {0xabbcu, 0x0u, 0x0u}, 1}, + {0x13edu, {0xabbdu, 0x0u, 0x0u}, 1}, + {0x13eeu, {0xabbeu, 0x0u, 0x0u}, 1}, + {0x13efu, {0xabbfu, 0x0u, 0x0u}, 1}, + {0x13f0u, {0x13f8u, 0x0u, 0x0u}, 1}, + {0x13f1u, {0x13f9u, 0x0u, 0x0u}, 1}, + {0x13f2u, {0x13fau, 0x0u, 0x0u}, 1}, + {0x13f3u, {0x13fbu, 0x0u, 0x0u}, 1}, + {0x13f4u, {0x13fcu, 0x0u, 0x0u}, 1}, + {0x13f5u, {0x13fdu, 0x0u, 0x0u}, 1}, + {0x1c89u, {0x1c8au, 0x0u, 0x0u}, 1}, + {0x1c90u, {0x10d0u, 0x0u, 0x0u}, 1}, + {0x1c91u, {0x10d1u, 0x0u, 0x0u}, 1}, + {0x1c92u, {0x10d2u, 0x0u, 0x0u}, 1}, + {0x1c93u, {0x10d3u, 0x0u, 0x0u}, 1}, + {0x1c94u, {0x10d4u, 0x0u, 0x0u}, 1}, + {0x1c95u, {0x10d5u, 0x0u, 0x0u}, 1}, + {0x1c96u, {0x10d6u, 0x0u, 0x0u}, 1}, + {0x1c97u, {0x10d7u, 0x0u, 0x0u}, 1}, + {0x1c98u, {0x10d8u, 0x0u, 0x0u}, 1}, + {0x1c99u, {0x10d9u, 0x0u, 0x0u}, 1}, + {0x1c9au, {0x10dau, 0x0u, 0x0u}, 1}, + {0x1c9bu, {0x10dbu, 0x0u, 0x0u}, 1}, + {0x1c9cu, {0x10dcu, 0x0u, 0x0u}, 1}, + {0x1c9du, {0x10ddu, 0x0u, 0x0u}, 1}, + {0x1c9eu, {0x10deu, 0x0u, 0x0u}, 1}, + {0x1c9fu, {0x10dfu, 0x0u, 0x0u}, 1}, + {0x1ca0u, {0x10e0u, 0x0u, 0x0u}, 1}, + {0x1ca1u, {0x10e1u, 0x0u, 0x0u}, 1}, + {0x1ca2u, {0x10e2u, 0x0u, 0x0u}, 1}, + {0x1ca3u, {0x10e3u, 0x0u, 0x0u}, 1}, + {0x1ca4u, {0x10e4u, 0x0u, 0x0u}, 1}, + {0x1ca5u, {0x10e5u, 0x0u, 0x0u}, 1}, + {0x1ca6u, {0x10e6u, 0x0u, 0x0u}, 1}, + {0x1ca7u, {0x10e7u, 0x0u, 0x0u}, 1}, + {0x1ca8u, {0x10e8u, 0x0u, 0x0u}, 1}, + {0x1ca9u, {0x10e9u, 0x0u, 0x0u}, 1}, + {0x1caau, {0x10eau, 0x0u, 0x0u}, 1}, + {0x1cabu, {0x10ebu, 0x0u, 0x0u}, 1}, + {0x1cacu, {0x10ecu, 0x0u, 0x0u}, 1}, + {0x1cadu, {0x10edu, 0x0u, 0x0u}, 1}, + {0x1caeu, {0x10eeu, 0x0u, 0x0u}, 1}, + {0x1cafu, {0x10efu, 0x0u, 0x0u}, 1}, + {0x1cb0u, {0x10f0u, 0x0u, 0x0u}, 1}, + {0x1cb1u, {0x10f1u, 0x0u, 0x0u}, 1}, + {0x1cb2u, {0x10f2u, 0x0u, 0x0u}, 1}, + {0x1cb3u, {0x10f3u, 0x0u, 0x0u}, 1}, + {0x1cb4u, {0x10f4u, 0x0u, 0x0u}, 1}, + {0x1cb5u, {0x10f5u, 0x0u, 0x0u}, 1}, + {0x1cb6u, {0x10f6u, 0x0u, 0x0u}, 1}, + {0x1cb7u, {0x10f7u, 0x0u, 0x0u}, 1}, + {0x1cb8u, {0x10f8u, 0x0u, 0x0u}, 1}, + {0x1cb9u, {0x10f9u, 0x0u, 0x0u}, 1}, + {0x1cbau, {0x10fau, 0x0u, 0x0u}, 1}, + {0x1cbdu, {0x10fdu, 0x0u, 0x0u}, 1}, + {0x1cbeu, {0x10feu, 0x0u, 0x0u}, 1}, + {0x1cbfu, {0x10ffu, 0x0u, 0x0u}, 1}, + {0x1e00u, {0x1e01u, 0x0u, 0x0u}, 1}, + {0x1e02u, {0x1e03u, 0x0u, 0x0u}, 1}, + {0x1e04u, {0x1e05u, 0x0u, 0x0u}, 1}, + {0x1e06u, {0x1e07u, 0x0u, 0x0u}, 1}, + {0x1e08u, {0x1e09u, 0x0u, 0x0u}, 1}, + {0x1e0au, {0x1e0bu, 0x0u, 0x0u}, 1}, + {0x1e0cu, {0x1e0du, 0x0u, 0x0u}, 1}, + {0x1e0eu, {0x1e0fu, 0x0u, 0x0u}, 1}, + {0x1e10u, {0x1e11u, 0x0u, 0x0u}, 1}, + {0x1e12u, {0x1e13u, 0x0u, 0x0u}, 1}, + {0x1e14u, {0x1e15u, 0x0u, 0x0u}, 1}, + {0x1e16u, {0x1e17u, 0x0u, 0x0u}, 1}, + {0x1e18u, {0x1e19u, 0x0u, 0x0u}, 1}, + {0x1e1au, {0x1e1bu, 0x0u, 0x0u}, 1}, + {0x1e1cu, {0x1e1du, 0x0u, 0x0u}, 1}, + {0x1e1eu, {0x1e1fu, 0x0u, 0x0u}, 1}, + {0x1e20u, {0x1e21u, 0x0u, 0x0u}, 1}, + {0x1e22u, {0x1e23u, 0x0u, 0x0u}, 1}, + {0x1e24u, {0x1e25u, 0x0u, 0x0u}, 1}, + {0x1e26u, {0x1e27u, 0x0u, 0x0u}, 1}, + {0x1e28u, {0x1e29u, 0x0u, 0x0u}, 1}, + {0x1e2au, {0x1e2bu, 0x0u, 0x0u}, 1}, + {0x1e2cu, {0x1e2du, 0x0u, 0x0u}, 1}, + {0x1e2eu, {0x1e2fu, 0x0u, 0x0u}, 1}, + {0x1e30u, {0x1e31u, 0x0u, 0x0u}, 1}, + {0x1e32u, {0x1e33u, 0x0u, 0x0u}, 1}, + {0x1e34u, {0x1e35u, 0x0u, 0x0u}, 1}, + {0x1e36u, {0x1e37u, 0x0u, 0x0u}, 1}, + {0x1e38u, {0x1e39u, 0x0u, 0x0u}, 1}, + {0x1e3au, {0x1e3bu, 0x0u, 0x0u}, 1}, + {0x1e3cu, {0x1e3du, 0x0u, 0x0u}, 1}, + {0x1e3eu, {0x1e3fu, 0x0u, 0x0u}, 1}, + {0x1e40u, {0x1e41u, 0x0u, 0x0u}, 1}, + {0x1e42u, {0x1e43u, 0x0u, 0x0u}, 1}, + {0x1e44u, {0x1e45u, 0x0u, 0x0u}, 1}, + {0x1e46u, {0x1e47u, 0x0u, 0x0u}, 1}, + {0x1e48u, {0x1e49u, 0x0u, 0x0u}, 1}, + {0x1e4au, {0x1e4bu, 0x0u, 0x0u}, 1}, + {0x1e4cu, {0x1e4du, 0x0u, 0x0u}, 1}, + {0x1e4eu, {0x1e4fu, 0x0u, 0x0u}, 1}, + {0x1e50u, {0x1e51u, 0x0u, 0x0u}, 1}, + {0x1e52u, {0x1e53u, 0x0u, 0x0u}, 1}, + {0x1e54u, {0x1e55u, 0x0u, 0x0u}, 1}, + {0x1e56u, {0x1e57u, 0x0u, 0x0u}, 1}, + {0x1e58u, {0x1e59u, 0x0u, 0x0u}, 1}, + {0x1e5au, {0x1e5bu, 0x0u, 0x0u}, 1}, + {0x1e5cu, {0x1e5du, 0x0u, 0x0u}, 1}, + {0x1e5eu, {0x1e5fu, 0x0u, 0x0u}, 1}, + {0x1e60u, {0x1e61u, 0x0u, 0x0u}, 1}, + {0x1e62u, {0x1e63u, 0x0u, 0x0u}, 1}, + {0x1e64u, {0x1e65u, 0x0u, 0x0u}, 1}, + {0x1e66u, {0x1e67u, 0x0u, 0x0u}, 1}, + {0x1e68u, {0x1e69u, 0x0u, 0x0u}, 1}, + {0x1e6au, {0x1e6bu, 0x0u, 0x0u}, 1}, + {0x1e6cu, {0x1e6du, 0x0u, 0x0u}, 1}, + {0x1e6eu, {0x1e6fu, 0x0u, 0x0u}, 1}, + {0x1e70u, {0x1e71u, 0x0u, 0x0u}, 1}, + {0x1e72u, {0x1e73u, 0x0u, 0x0u}, 1}, + {0x1e74u, {0x1e75u, 0x0u, 0x0u}, 1}, + {0x1e76u, {0x1e77u, 0x0u, 0x0u}, 1}, + {0x1e78u, {0x1e79u, 0x0u, 0x0u}, 1}, + {0x1e7au, {0x1e7bu, 0x0u, 0x0u}, 1}, + {0x1e7cu, {0x1e7du, 0x0u, 0x0u}, 1}, + {0x1e7eu, {0x1e7fu, 0x0u, 0x0u}, 1}, + {0x1e80u, {0x1e81u, 0x0u, 0x0u}, 1}, + {0x1e82u, {0x1e83u, 0x0u, 0x0u}, 1}, + {0x1e84u, {0x1e85u, 0x0u, 0x0u}, 1}, + {0x1e86u, {0x1e87u, 0x0u, 0x0u}, 1}, + {0x1e88u, {0x1e89u, 0x0u, 0x0u}, 1}, + {0x1e8au, {0x1e8bu, 0x0u, 0x0u}, 1}, + {0x1e8cu, {0x1e8du, 0x0u, 0x0u}, 1}, + {0x1e8eu, {0x1e8fu, 0x0u, 0x0u}, 1}, + {0x1e90u, {0x1e91u, 0x0u, 0x0u}, 1}, + {0x1e92u, {0x1e93u, 0x0u, 0x0u}, 1}, + {0x1e94u, {0x1e95u, 0x0u, 0x0u}, 1}, + {0x1e9eu, {0xdfu, 0x0u, 0x0u}, 1}, + {0x1ea0u, {0x1ea1u, 0x0u, 0x0u}, 1}, + {0x1ea2u, {0x1ea3u, 0x0u, 0x0u}, 1}, + {0x1ea4u, {0x1ea5u, 0x0u, 0x0u}, 1}, + {0x1ea6u, {0x1ea7u, 0x0u, 0x0u}, 1}, + {0x1ea8u, {0x1ea9u, 0x0u, 0x0u}, 1}, + {0x1eaau, {0x1eabu, 0x0u, 0x0u}, 1}, + {0x1eacu, {0x1eadu, 0x0u, 0x0u}, 1}, + {0x1eaeu, {0x1eafu, 0x0u, 0x0u}, 1}, + {0x1eb0u, {0x1eb1u, 0x0u, 0x0u}, 1}, + {0x1eb2u, {0x1eb3u, 0x0u, 0x0u}, 1}, + {0x1eb4u, {0x1eb5u, 0x0u, 0x0u}, 1}, + {0x1eb6u, {0x1eb7u, 0x0u, 0x0u}, 1}, + {0x1eb8u, {0x1eb9u, 0x0u, 0x0u}, 1}, + {0x1ebau, {0x1ebbu, 0x0u, 0x0u}, 1}, + {0x1ebcu, {0x1ebdu, 0x0u, 0x0u}, 1}, + {0x1ebeu, {0x1ebfu, 0x0u, 0x0u}, 1}, + {0x1ec0u, {0x1ec1u, 0x0u, 0x0u}, 1}, + {0x1ec2u, {0x1ec3u, 0x0u, 0x0u}, 1}, + {0x1ec4u, {0x1ec5u, 0x0u, 0x0u}, 1}, + {0x1ec6u, {0x1ec7u, 0x0u, 0x0u}, 1}, + {0x1ec8u, {0x1ec9u, 0x0u, 0x0u}, 1}, + {0x1ecau, {0x1ecbu, 0x0u, 0x0u}, 1}, + {0x1eccu, {0x1ecdu, 0x0u, 0x0u}, 1}, + {0x1eceu, {0x1ecfu, 0x0u, 0x0u}, 1}, + {0x1ed0u, {0x1ed1u, 0x0u, 0x0u}, 1}, + {0x1ed2u, {0x1ed3u, 0x0u, 0x0u}, 1}, + {0x1ed4u, {0x1ed5u, 0x0u, 0x0u}, 1}, + {0x1ed6u, {0x1ed7u, 0x0u, 0x0u}, 1}, + {0x1ed8u, {0x1ed9u, 0x0u, 0x0u}, 1}, + {0x1edau, {0x1edbu, 0x0u, 0x0u}, 1}, + {0x1edcu, {0x1eddu, 0x0u, 0x0u}, 1}, + {0x1edeu, {0x1edfu, 0x0u, 0x0u}, 1}, + {0x1ee0u, {0x1ee1u, 0x0u, 0x0u}, 1}, + {0x1ee2u, {0x1ee3u, 0x0u, 0x0u}, 1}, + {0x1ee4u, {0x1ee5u, 0x0u, 0x0u}, 1}, + {0x1ee6u, {0x1ee7u, 0x0u, 0x0u}, 1}, + {0x1ee8u, {0x1ee9u, 0x0u, 0x0u}, 1}, + {0x1eeau, {0x1eebu, 0x0u, 0x0u}, 1}, + {0x1eecu, {0x1eedu, 0x0u, 0x0u}, 1}, + {0x1eeeu, {0x1eefu, 0x0u, 0x0u}, 1}, + {0x1ef0u, {0x1ef1u, 0x0u, 0x0u}, 1}, + {0x1ef2u, {0x1ef3u, 0x0u, 0x0u}, 1}, + {0x1ef4u, {0x1ef5u, 0x0u, 0x0u}, 1}, + {0x1ef6u, {0x1ef7u, 0x0u, 0x0u}, 1}, + {0x1ef8u, {0x1ef9u, 0x0u, 0x0u}, 1}, + {0x1efau, {0x1efbu, 0x0u, 0x0u}, 1}, + {0x1efcu, {0x1efdu, 0x0u, 0x0u}, 1}, + {0x1efeu, {0x1effu, 0x0u, 0x0u}, 1}, + {0x1f08u, {0x1f00u, 0x0u, 0x0u}, 1}, + {0x1f09u, {0x1f01u, 0x0u, 0x0u}, 1}, + {0x1f0au, {0x1f02u, 0x0u, 0x0u}, 1}, + {0x1f0bu, {0x1f03u, 0x0u, 0x0u}, 1}, + {0x1f0cu, {0x1f04u, 0x0u, 0x0u}, 1}, + {0x1f0du, {0x1f05u, 0x0u, 0x0u}, 1}, + {0x1f0eu, {0x1f06u, 0x0u, 0x0u}, 1}, + {0x1f0fu, {0x1f07u, 0x0u, 0x0u}, 1}, + {0x1f18u, {0x1f10u, 0x0u, 0x0u}, 1}, + {0x1f19u, {0x1f11u, 0x0u, 0x0u}, 1}, + {0x1f1au, {0x1f12u, 0x0u, 0x0u}, 1}, + {0x1f1bu, {0x1f13u, 0x0u, 0x0u}, 1}, + {0x1f1cu, {0x1f14u, 0x0u, 0x0u}, 1}, + {0x1f1du, {0x1f15u, 0x0u, 0x0u}, 1}, + {0x1f28u, {0x1f20u, 0x0u, 0x0u}, 1}, + {0x1f29u, {0x1f21u, 0x0u, 0x0u}, 1}, + {0x1f2au, {0x1f22u, 0x0u, 0x0u}, 1}, + {0x1f2bu, {0x1f23u, 0x0u, 0x0u}, 1}, + {0x1f2cu, {0x1f24u, 0x0u, 0x0u}, 1}, + {0x1f2du, {0x1f25u, 0x0u, 0x0u}, 1}, + {0x1f2eu, {0x1f26u, 0x0u, 0x0u}, 1}, + {0x1f2fu, {0x1f27u, 0x0u, 0x0u}, 1}, + {0x1f38u, {0x1f30u, 0x0u, 0x0u}, 1}, + {0x1f39u, {0x1f31u, 0x0u, 0x0u}, 1}, + {0x1f3au, {0x1f32u, 0x0u, 0x0u}, 1}, + {0x1f3bu, {0x1f33u, 0x0u, 0x0u}, 1}, + {0x1f3cu, {0x1f34u, 0x0u, 0x0u}, 1}, + {0x1f3du, {0x1f35u, 0x0u, 0x0u}, 1}, + {0x1f3eu, {0x1f36u, 0x0u, 0x0u}, 1}, + {0x1f3fu, {0x1f37u, 0x0u, 0x0u}, 1}, + {0x1f48u, {0x1f40u, 0x0u, 0x0u}, 1}, + {0x1f49u, {0x1f41u, 0x0u, 0x0u}, 1}, + {0x1f4au, {0x1f42u, 0x0u, 0x0u}, 1}, + {0x1f4bu, {0x1f43u, 0x0u, 0x0u}, 1}, + {0x1f4cu, {0x1f44u, 0x0u, 0x0u}, 1}, + {0x1f4du, {0x1f45u, 0x0u, 0x0u}, 1}, + {0x1f59u, {0x1f51u, 0x0u, 0x0u}, 1}, + {0x1f5bu, {0x1f53u, 0x0u, 0x0u}, 1}, + {0x1f5du, {0x1f55u, 0x0u, 0x0u}, 1}, + {0x1f5fu, {0x1f57u, 0x0u, 0x0u}, 1}, + {0x1f68u, {0x1f60u, 0x0u, 0x0u}, 1}, + {0x1f69u, {0x1f61u, 0x0u, 0x0u}, 1}, + {0x1f6au, {0x1f62u, 0x0u, 0x0u}, 1}, + {0x1f6bu, {0x1f63u, 0x0u, 0x0u}, 1}, + {0x1f6cu, {0x1f64u, 0x0u, 0x0u}, 1}, + {0x1f6du, {0x1f65u, 0x0u, 0x0u}, 1}, + {0x1f6eu, {0x1f66u, 0x0u, 0x0u}, 1}, + {0x1f6fu, {0x1f67u, 0x0u, 0x0u}, 1}, + {0x1f88u, {0x1f80u, 0x0u, 0x0u}, 1}, + {0x1f89u, {0x1f81u, 0x0u, 0x0u}, 1}, + {0x1f8au, {0x1f82u, 0x0u, 0x0u}, 1}, + {0x1f8bu, {0x1f83u, 0x0u, 0x0u}, 1}, + {0x1f8cu, {0x1f84u, 0x0u, 0x0u}, 1}, + {0x1f8du, {0x1f85u, 0x0u, 0x0u}, 1}, + {0x1f8eu, {0x1f86u, 0x0u, 0x0u}, 1}, + {0x1f8fu, {0x1f87u, 0x0u, 0x0u}, 1}, + {0x1f98u, {0x1f90u, 0x0u, 0x0u}, 1}, + {0x1f99u, {0x1f91u, 0x0u, 0x0u}, 1}, + {0x1f9au, {0x1f92u, 0x0u, 0x0u}, 1}, + {0x1f9bu, {0x1f93u, 0x0u, 0x0u}, 1}, + {0x1f9cu, {0x1f94u, 0x0u, 0x0u}, 1}, + {0x1f9du, {0x1f95u, 0x0u, 0x0u}, 1}, + {0x1f9eu, {0x1f96u, 0x0u, 0x0u}, 1}, + {0x1f9fu, {0x1f97u, 0x0u, 0x0u}, 1}, + {0x1fa8u, {0x1fa0u, 0x0u, 0x0u}, 1}, + {0x1fa9u, {0x1fa1u, 0x0u, 0x0u}, 1}, + {0x1faau, {0x1fa2u, 0x0u, 0x0u}, 1}, + {0x1fabu, {0x1fa3u, 0x0u, 0x0u}, 1}, + {0x1facu, {0x1fa4u, 0x0u, 0x0u}, 1}, + {0x1fadu, {0x1fa5u, 0x0u, 0x0u}, 1}, + {0x1faeu, {0x1fa6u, 0x0u, 0x0u}, 1}, + {0x1fafu, {0x1fa7u, 0x0u, 0x0u}, 1}, + {0x1fb8u, {0x1fb0u, 0x0u, 0x0u}, 1}, + {0x1fb9u, {0x1fb1u, 0x0u, 0x0u}, 1}, + {0x1fbau, {0x1f70u, 0x0u, 0x0u}, 1}, + {0x1fbbu, {0x1f71u, 0x0u, 0x0u}, 1}, + {0x1fbcu, {0x1fb3u, 0x0u, 0x0u}, 1}, + {0x1fc8u, {0x1f72u, 0x0u, 0x0u}, 1}, + {0x1fc9u, {0x1f73u, 0x0u, 0x0u}, 1}, + {0x1fcau, {0x1f74u, 0x0u, 0x0u}, 1}, + {0x1fcbu, {0x1f75u, 0x0u, 0x0u}, 1}, + {0x1fccu, {0x1fc3u, 0x0u, 0x0u}, 1}, + {0x1fd8u, {0x1fd0u, 0x0u, 0x0u}, 1}, + {0x1fd9u, {0x1fd1u, 0x0u, 0x0u}, 1}, + {0x1fdau, {0x1f76u, 0x0u, 0x0u}, 1}, + {0x1fdbu, {0x1f77u, 0x0u, 0x0u}, 1}, + {0x1fe8u, {0x1fe0u, 0x0u, 0x0u}, 1}, + {0x1fe9u, {0x1fe1u, 0x0u, 0x0u}, 1}, + {0x1feau, {0x1f7au, 0x0u, 0x0u}, 1}, + {0x1febu, {0x1f7bu, 0x0u, 0x0u}, 1}, + {0x1fecu, {0x1fe5u, 0x0u, 0x0u}, 1}, + {0x1ff8u, {0x1f78u, 0x0u, 0x0u}, 1}, + {0x1ff9u, {0x1f79u, 0x0u, 0x0u}, 1}, + {0x1ffau, {0x1f7cu, 0x0u, 0x0u}, 1}, + {0x1ffbu, {0x1f7du, 0x0u, 0x0u}, 1}, + {0x1ffcu, {0x1ff3u, 0x0u, 0x0u}, 1}, + {0x2126u, {0x3c9u, 0x0u, 0x0u}, 1}, + {0x212au, {0x6bu, 0x0u, 0x0u}, 1}, + {0x212bu, {0xe5u, 0x0u, 0x0u}, 1}, + {0x2132u, {0x214eu, 0x0u, 0x0u}, 1}, + {0x2160u, {0x2170u, 0x0u, 0x0u}, 1}, + {0x2161u, {0x2171u, 0x0u, 0x0u}, 1}, + {0x2162u, {0x2172u, 0x0u, 0x0u}, 1}, + {0x2163u, {0x2173u, 0x0u, 0x0u}, 1}, + {0x2164u, {0x2174u, 0x0u, 0x0u}, 1}, + {0x2165u, {0x2175u, 0x0u, 0x0u}, 1}, + {0x2166u, {0x2176u, 0x0u, 0x0u}, 1}, + {0x2167u, {0x2177u, 0x0u, 0x0u}, 1}, + {0x2168u, {0x2178u, 0x0u, 0x0u}, 1}, + {0x2169u, {0x2179u, 0x0u, 0x0u}, 1}, + {0x216au, {0x217au, 0x0u, 0x0u}, 1}, + {0x216bu, {0x217bu, 0x0u, 0x0u}, 1}, + {0x216cu, {0x217cu, 0x0u, 0x0u}, 1}, + {0x216du, {0x217du, 0x0u, 0x0u}, 1}, + {0x216eu, {0x217eu, 0x0u, 0x0u}, 1}, + {0x216fu, {0x217fu, 0x0u, 0x0u}, 1}, + {0x2183u, {0x2184u, 0x0u, 0x0u}, 1}, + {0x24b6u, {0x24d0u, 0x0u, 0x0u}, 1}, + {0x24b7u, {0x24d1u, 0x0u, 0x0u}, 1}, + {0x24b8u, {0x24d2u, 0x0u, 0x0u}, 1}, + {0x24b9u, {0x24d3u, 0x0u, 0x0u}, 1}, + {0x24bau, {0x24d4u, 0x0u, 0x0u}, 1}, + {0x24bbu, {0x24d5u, 0x0u, 0x0u}, 1}, + {0x24bcu, {0x24d6u, 0x0u, 0x0u}, 1}, + {0x24bdu, {0x24d7u, 0x0u, 0x0u}, 1}, + {0x24beu, {0x24d8u, 0x0u, 0x0u}, 1}, + {0x24bfu, {0x24d9u, 0x0u, 0x0u}, 1}, + {0x24c0u, {0x24dau, 0x0u, 0x0u}, 1}, + {0x24c1u, {0x24dbu, 0x0u, 0x0u}, 1}, + {0x24c2u, {0x24dcu, 0x0u, 0x0u}, 1}, + {0x24c3u, {0x24ddu, 0x0u, 0x0u}, 1}, + {0x24c4u, {0x24deu, 0x0u, 0x0u}, 1}, + {0x24c5u, {0x24dfu, 0x0u, 0x0u}, 1}, + {0x24c6u, {0x24e0u, 0x0u, 0x0u}, 1}, + {0x24c7u, {0x24e1u, 0x0u, 0x0u}, 1}, + {0x24c8u, {0x24e2u, 0x0u, 0x0u}, 1}, + {0x24c9u, {0x24e3u, 0x0u, 0x0u}, 1}, + {0x24cau, {0x24e4u, 0x0u, 0x0u}, 1}, + {0x24cbu, {0x24e5u, 0x0u, 0x0u}, 1}, + {0x24ccu, {0x24e6u, 0x0u, 0x0u}, 1}, + {0x24cdu, {0x24e7u, 0x0u, 0x0u}, 1}, + {0x24ceu, {0x24e8u, 0x0u, 0x0u}, 1}, + {0x24cfu, {0x24e9u, 0x0u, 0x0u}, 1}, + {0x2c00u, {0x2c30u, 0x0u, 0x0u}, 1}, + {0x2c01u, {0x2c31u, 0x0u, 0x0u}, 1}, + {0x2c02u, {0x2c32u, 0x0u, 0x0u}, 1}, + {0x2c03u, {0x2c33u, 0x0u, 0x0u}, 1}, + {0x2c04u, {0x2c34u, 0x0u, 0x0u}, 1}, + {0x2c05u, {0x2c35u, 0x0u, 0x0u}, 1}, + {0x2c06u, {0x2c36u, 0x0u, 0x0u}, 1}, + {0x2c07u, {0x2c37u, 0x0u, 0x0u}, 1}, + {0x2c08u, {0x2c38u, 0x0u, 0x0u}, 1}, + {0x2c09u, {0x2c39u, 0x0u, 0x0u}, 1}, + {0x2c0au, {0x2c3au, 0x0u, 0x0u}, 1}, + {0x2c0bu, {0x2c3bu, 0x0u, 0x0u}, 1}, + {0x2c0cu, {0x2c3cu, 0x0u, 0x0u}, 1}, + {0x2c0du, {0x2c3du, 0x0u, 0x0u}, 1}, + {0x2c0eu, {0x2c3eu, 0x0u, 0x0u}, 1}, + {0x2c0fu, {0x2c3fu, 0x0u, 0x0u}, 1}, + {0x2c10u, {0x2c40u, 0x0u, 0x0u}, 1}, + {0x2c11u, {0x2c41u, 0x0u, 0x0u}, 1}, + {0x2c12u, {0x2c42u, 0x0u, 0x0u}, 1}, + {0x2c13u, {0x2c43u, 0x0u, 0x0u}, 1}, + {0x2c14u, {0x2c44u, 0x0u, 0x0u}, 1}, + {0x2c15u, {0x2c45u, 0x0u, 0x0u}, 1}, + {0x2c16u, {0x2c46u, 0x0u, 0x0u}, 1}, + {0x2c17u, {0x2c47u, 0x0u, 0x0u}, 1}, + {0x2c18u, {0x2c48u, 0x0u, 0x0u}, 1}, + {0x2c19u, {0x2c49u, 0x0u, 0x0u}, 1}, + {0x2c1au, {0x2c4au, 0x0u, 0x0u}, 1}, + {0x2c1bu, {0x2c4bu, 0x0u, 0x0u}, 1}, + {0x2c1cu, {0x2c4cu, 0x0u, 0x0u}, 1}, + {0x2c1du, {0x2c4du, 0x0u, 0x0u}, 1}, + {0x2c1eu, {0x2c4eu, 0x0u, 0x0u}, 1}, + {0x2c1fu, {0x2c4fu, 0x0u, 0x0u}, 1}, + {0x2c20u, {0x2c50u, 0x0u, 0x0u}, 1}, + {0x2c21u, {0x2c51u, 0x0u, 0x0u}, 1}, + {0x2c22u, {0x2c52u, 0x0u, 0x0u}, 1}, + {0x2c23u, {0x2c53u, 0x0u, 0x0u}, 1}, + {0x2c24u, {0x2c54u, 0x0u, 0x0u}, 1}, + {0x2c25u, {0x2c55u, 0x0u, 0x0u}, 1}, + {0x2c26u, {0x2c56u, 0x0u, 0x0u}, 1}, + {0x2c27u, {0x2c57u, 0x0u, 0x0u}, 1}, + {0x2c28u, {0x2c58u, 0x0u, 0x0u}, 1}, + {0x2c29u, {0x2c59u, 0x0u, 0x0u}, 1}, + {0x2c2au, {0x2c5au, 0x0u, 0x0u}, 1}, + {0x2c2bu, {0x2c5bu, 0x0u, 0x0u}, 1}, + {0x2c2cu, {0x2c5cu, 0x0u, 0x0u}, 1}, + {0x2c2du, {0x2c5du, 0x0u, 0x0u}, 1}, + {0x2c2eu, {0x2c5eu, 0x0u, 0x0u}, 1}, + {0x2c2fu, {0x2c5fu, 0x0u, 0x0u}, 1}, + {0x2c60u, {0x2c61u, 0x0u, 0x0u}, 1}, + {0x2c62u, {0x26bu, 0x0u, 0x0u}, 1}, + {0x2c63u, {0x1d7du, 0x0u, 0x0u}, 1}, + {0x2c64u, {0x27du, 0x0u, 0x0u}, 1}, + {0x2c67u, {0x2c68u, 0x0u, 0x0u}, 1}, + {0x2c69u, {0x2c6au, 0x0u, 0x0u}, 1}, + {0x2c6bu, {0x2c6cu, 0x0u, 0x0u}, 1}, + {0x2c6du, {0x251u, 0x0u, 0x0u}, 1}, + {0x2c6eu, {0x271u, 0x0u, 0x0u}, 1}, + {0x2c6fu, {0x250u, 0x0u, 0x0u}, 1}, + {0x2c70u, {0x252u, 0x0u, 0x0u}, 1}, + {0x2c72u, {0x2c73u, 0x0u, 0x0u}, 1}, + {0x2c75u, {0x2c76u, 0x0u, 0x0u}, 1}, + {0x2c7eu, {0x23fu, 0x0u, 0x0u}, 1}, + {0x2c7fu, {0x240u, 0x0u, 0x0u}, 1}, + {0x2c80u, {0x2c81u, 0x0u, 0x0u}, 1}, + {0x2c82u, {0x2c83u, 0x0u, 0x0u}, 1}, + {0x2c84u, {0x2c85u, 0x0u, 0x0u}, 1}, + {0x2c86u, {0x2c87u, 0x0u, 0x0u}, 1}, + {0x2c88u, {0x2c89u, 0x0u, 0x0u}, 1}, + {0x2c8au, {0x2c8bu, 0x0u, 0x0u}, 1}, + {0x2c8cu, {0x2c8du, 0x0u, 0x0u}, 1}, + {0x2c8eu, {0x2c8fu, 0x0u, 0x0u}, 1}, + {0x2c90u, {0x2c91u, 0x0u, 0x0u}, 1}, + {0x2c92u, {0x2c93u, 0x0u, 0x0u}, 1}, + {0x2c94u, {0x2c95u, 0x0u, 0x0u}, 1}, + {0x2c96u, {0x2c97u, 0x0u, 0x0u}, 1}, + {0x2c98u, {0x2c99u, 0x0u, 0x0u}, 1}, + {0x2c9au, {0x2c9bu, 0x0u, 0x0u}, 1}, + {0x2c9cu, {0x2c9du, 0x0u, 0x0u}, 1}, + {0x2c9eu, {0x2c9fu, 0x0u, 0x0u}, 1}, + {0x2ca0u, {0x2ca1u, 0x0u, 0x0u}, 1}, + {0x2ca2u, {0x2ca3u, 0x0u, 0x0u}, 1}, + {0x2ca4u, {0x2ca5u, 0x0u, 0x0u}, 1}, + {0x2ca6u, {0x2ca7u, 0x0u, 0x0u}, 1}, + {0x2ca8u, {0x2ca9u, 0x0u, 0x0u}, 1}, + {0x2caau, {0x2cabu, 0x0u, 0x0u}, 1}, + {0x2cacu, {0x2cadu, 0x0u, 0x0u}, 1}, + {0x2caeu, {0x2cafu, 0x0u, 0x0u}, 1}, + {0x2cb0u, {0x2cb1u, 0x0u, 0x0u}, 1}, + {0x2cb2u, {0x2cb3u, 0x0u, 0x0u}, 1}, + {0x2cb4u, {0x2cb5u, 0x0u, 0x0u}, 1}, + {0x2cb6u, {0x2cb7u, 0x0u, 0x0u}, 1}, + {0x2cb8u, {0x2cb9u, 0x0u, 0x0u}, 1}, + {0x2cbau, {0x2cbbu, 0x0u, 0x0u}, 1}, + {0x2cbcu, {0x2cbdu, 0x0u, 0x0u}, 1}, + {0x2cbeu, {0x2cbfu, 0x0u, 0x0u}, 1}, + {0x2cc0u, {0x2cc1u, 0x0u, 0x0u}, 1}, + {0x2cc2u, {0x2cc3u, 0x0u, 0x0u}, 1}, + {0x2cc4u, {0x2cc5u, 0x0u, 0x0u}, 1}, + {0x2cc6u, {0x2cc7u, 0x0u, 0x0u}, 1}, + {0x2cc8u, {0x2cc9u, 0x0u, 0x0u}, 1}, + {0x2ccau, {0x2ccbu, 0x0u, 0x0u}, 1}, + {0x2cccu, {0x2ccdu, 0x0u, 0x0u}, 1}, + {0x2cceu, {0x2ccfu, 0x0u, 0x0u}, 1}, + {0x2cd0u, {0x2cd1u, 0x0u, 0x0u}, 1}, + {0x2cd2u, {0x2cd3u, 0x0u, 0x0u}, 1}, + {0x2cd4u, {0x2cd5u, 0x0u, 0x0u}, 1}, + {0x2cd6u, {0x2cd7u, 0x0u, 0x0u}, 1}, + {0x2cd8u, {0x2cd9u, 0x0u, 0x0u}, 1}, + {0x2cdau, {0x2cdbu, 0x0u, 0x0u}, 1}, + {0x2cdcu, {0x2cddu, 0x0u, 0x0u}, 1}, + {0x2cdeu, {0x2cdfu, 0x0u, 0x0u}, 1}, + {0x2ce0u, {0x2ce1u, 0x0u, 0x0u}, 1}, + {0x2ce2u, {0x2ce3u, 0x0u, 0x0u}, 1}, + {0x2cebu, {0x2cecu, 0x0u, 0x0u}, 1}, + {0x2cedu, {0x2ceeu, 0x0u, 0x0u}, 1}, + {0x2cf2u, {0x2cf3u, 0x0u, 0x0u}, 1}, + {0xa640u, {0xa641u, 0x0u, 0x0u}, 1}, + {0xa642u, {0xa643u, 0x0u, 0x0u}, 1}, + {0xa644u, {0xa645u, 0x0u, 0x0u}, 1}, + {0xa646u, {0xa647u, 0x0u, 0x0u}, 1}, + {0xa648u, {0xa649u, 0x0u, 0x0u}, 1}, + {0xa64au, {0xa64bu, 0x0u, 0x0u}, 1}, + {0xa64cu, {0xa64du, 0x0u, 0x0u}, 1}, + {0xa64eu, {0xa64fu, 0x0u, 0x0u}, 1}, + {0xa650u, {0xa651u, 0x0u, 0x0u}, 1}, + {0xa652u, {0xa653u, 0x0u, 0x0u}, 1}, + {0xa654u, {0xa655u, 0x0u, 0x0u}, 1}, + {0xa656u, {0xa657u, 0x0u, 0x0u}, 1}, + {0xa658u, {0xa659u, 0x0u, 0x0u}, 1}, + {0xa65au, {0xa65bu, 0x0u, 0x0u}, 1}, + {0xa65cu, {0xa65du, 0x0u, 0x0u}, 1}, + {0xa65eu, {0xa65fu, 0x0u, 0x0u}, 1}, + {0xa660u, {0xa661u, 0x0u, 0x0u}, 1}, + {0xa662u, {0xa663u, 0x0u, 0x0u}, 1}, + {0xa664u, {0xa665u, 0x0u, 0x0u}, 1}, + {0xa666u, {0xa667u, 0x0u, 0x0u}, 1}, + {0xa668u, {0xa669u, 0x0u, 0x0u}, 1}, + {0xa66au, {0xa66bu, 0x0u, 0x0u}, 1}, + {0xa66cu, {0xa66du, 0x0u, 0x0u}, 1}, + {0xa680u, {0xa681u, 0x0u, 0x0u}, 1}, + {0xa682u, {0xa683u, 0x0u, 0x0u}, 1}, + {0xa684u, {0xa685u, 0x0u, 0x0u}, 1}, + {0xa686u, {0xa687u, 0x0u, 0x0u}, 1}, + {0xa688u, {0xa689u, 0x0u, 0x0u}, 1}, + {0xa68au, {0xa68bu, 0x0u, 0x0u}, 1}, + {0xa68cu, {0xa68du, 0x0u, 0x0u}, 1}, + {0xa68eu, {0xa68fu, 0x0u, 0x0u}, 1}, + {0xa690u, {0xa691u, 0x0u, 0x0u}, 1}, + {0xa692u, {0xa693u, 0x0u, 0x0u}, 1}, + {0xa694u, {0xa695u, 0x0u, 0x0u}, 1}, + {0xa696u, {0xa697u, 0x0u, 0x0u}, 1}, + {0xa698u, {0xa699u, 0x0u, 0x0u}, 1}, + {0xa69au, {0xa69bu, 0x0u, 0x0u}, 1}, + {0xa722u, {0xa723u, 0x0u, 0x0u}, 1}, + {0xa724u, {0xa725u, 0x0u, 0x0u}, 1}, + {0xa726u, {0xa727u, 0x0u, 0x0u}, 1}, + {0xa728u, {0xa729u, 0x0u, 0x0u}, 1}, + {0xa72au, {0xa72bu, 0x0u, 0x0u}, 1}, + {0xa72cu, {0xa72du, 0x0u, 0x0u}, 1}, + {0xa72eu, {0xa72fu, 0x0u, 0x0u}, 1}, + {0xa732u, {0xa733u, 0x0u, 0x0u}, 1}, + {0xa734u, {0xa735u, 0x0u, 0x0u}, 1}, + {0xa736u, {0xa737u, 0x0u, 0x0u}, 1}, + {0xa738u, {0xa739u, 0x0u, 0x0u}, 1}, + {0xa73au, {0xa73bu, 0x0u, 0x0u}, 1}, + {0xa73cu, {0xa73du, 0x0u, 0x0u}, 1}, + {0xa73eu, {0xa73fu, 0x0u, 0x0u}, 1}, + {0xa740u, {0xa741u, 0x0u, 0x0u}, 1}, + {0xa742u, {0xa743u, 0x0u, 0x0u}, 1}, + {0xa744u, {0xa745u, 0x0u, 0x0u}, 1}, + {0xa746u, {0xa747u, 0x0u, 0x0u}, 1}, + {0xa748u, {0xa749u, 0x0u, 0x0u}, 1}, + {0xa74au, {0xa74bu, 0x0u, 0x0u}, 1}, + {0xa74cu, {0xa74du, 0x0u, 0x0u}, 1}, + {0xa74eu, {0xa74fu, 0x0u, 0x0u}, 1}, + {0xa750u, {0xa751u, 0x0u, 0x0u}, 1}, + {0xa752u, {0xa753u, 0x0u, 0x0u}, 1}, + {0xa754u, {0xa755u, 0x0u, 0x0u}, 1}, + {0xa756u, {0xa757u, 0x0u, 0x0u}, 1}, + {0xa758u, {0xa759u, 0x0u, 0x0u}, 1}, + {0xa75au, {0xa75bu, 0x0u, 0x0u}, 1}, + {0xa75cu, {0xa75du, 0x0u, 0x0u}, 1}, + {0xa75eu, {0xa75fu, 0x0u, 0x0u}, 1}, + {0xa760u, {0xa761u, 0x0u, 0x0u}, 1}, + {0xa762u, {0xa763u, 0x0u, 0x0u}, 1}, + {0xa764u, {0xa765u, 0x0u, 0x0u}, 1}, + {0xa766u, {0xa767u, 0x0u, 0x0u}, 1}, + {0xa768u, {0xa769u, 0x0u, 0x0u}, 1}, + {0xa76au, {0xa76bu, 0x0u, 0x0u}, 1}, + {0xa76cu, {0xa76du, 0x0u, 0x0u}, 1}, + {0xa76eu, {0xa76fu, 0x0u, 0x0u}, 1}, + {0xa779u, {0xa77au, 0x0u, 0x0u}, 1}, + {0xa77bu, {0xa77cu, 0x0u, 0x0u}, 1}, + {0xa77du, {0x1d79u, 0x0u, 0x0u}, 1}, + {0xa77eu, {0xa77fu, 0x0u, 0x0u}, 1}, + {0xa780u, {0xa781u, 0x0u, 0x0u}, 1}, + {0xa782u, {0xa783u, 0x0u, 0x0u}, 1}, + {0xa784u, {0xa785u, 0x0u, 0x0u}, 1}, + {0xa786u, {0xa787u, 0x0u, 0x0u}, 1}, + {0xa78bu, {0xa78cu, 0x0u, 0x0u}, 1}, + {0xa78du, {0x265u, 0x0u, 0x0u}, 1}, + {0xa790u, {0xa791u, 0x0u, 0x0u}, 1}, + {0xa792u, {0xa793u, 0x0u, 0x0u}, 1}, + {0xa796u, {0xa797u, 0x0u, 0x0u}, 1}, + {0xa798u, {0xa799u, 0x0u, 0x0u}, 1}, + {0xa79au, {0xa79bu, 0x0u, 0x0u}, 1}, + {0xa79cu, {0xa79du, 0x0u, 0x0u}, 1}, + {0xa79eu, {0xa79fu, 0x0u, 0x0u}, 1}, + {0xa7a0u, {0xa7a1u, 0x0u, 0x0u}, 1}, + {0xa7a2u, {0xa7a3u, 0x0u, 0x0u}, 1}, + {0xa7a4u, {0xa7a5u, 0x0u, 0x0u}, 1}, + {0xa7a6u, {0xa7a7u, 0x0u, 0x0u}, 1}, + {0xa7a8u, {0xa7a9u, 0x0u, 0x0u}, 1}, + {0xa7aau, {0x266u, 0x0u, 0x0u}, 1}, + {0xa7abu, {0x25cu, 0x0u, 0x0u}, 1}, + {0xa7acu, {0x261u, 0x0u, 0x0u}, 1}, + {0xa7adu, {0x26cu, 0x0u, 0x0u}, 1}, + {0xa7aeu, {0x26au, 0x0u, 0x0u}, 1}, + {0xa7b0u, {0x29eu, 0x0u, 0x0u}, 1}, + {0xa7b1u, {0x287u, 0x0u, 0x0u}, 1}, + {0xa7b2u, {0x29du, 0x0u, 0x0u}, 1}, + {0xa7b3u, {0xab53u, 0x0u, 0x0u}, 1}, + {0xa7b4u, {0xa7b5u, 0x0u, 0x0u}, 1}, + {0xa7b6u, {0xa7b7u, 0x0u, 0x0u}, 1}, + {0xa7b8u, {0xa7b9u, 0x0u, 0x0u}, 1}, + {0xa7bau, {0xa7bbu, 0x0u, 0x0u}, 1}, + {0xa7bcu, {0xa7bdu, 0x0u, 0x0u}, 1}, + {0xa7beu, {0xa7bfu, 0x0u, 0x0u}, 1}, + {0xa7c0u, {0xa7c1u, 0x0u, 0x0u}, 1}, + {0xa7c2u, {0xa7c3u, 0x0u, 0x0u}, 1}, + {0xa7c4u, {0xa794u, 0x0u, 0x0u}, 1}, + {0xa7c5u, {0x282u, 0x0u, 0x0u}, 1}, + {0xa7c6u, {0x1d8eu, 0x0u, 0x0u}, 1}, + {0xa7c7u, {0xa7c8u, 0x0u, 0x0u}, 1}, + {0xa7c9u, {0xa7cau, 0x0u, 0x0u}, 1}, + {0xa7cbu, {0x264u, 0x0u, 0x0u}, 1}, + {0xa7ccu, {0xa7cdu, 0x0u, 0x0u}, 1}, + {0xa7ceu, {0xa7cfu, 0x0u, 0x0u}, 1}, + {0xa7d0u, {0xa7d1u, 0x0u, 0x0u}, 1}, + {0xa7d2u, {0xa7d3u, 0x0u, 0x0u}, 1}, + {0xa7d4u, {0xa7d5u, 0x0u, 0x0u}, 1}, + {0xa7d6u, {0xa7d7u, 0x0u, 0x0u}, 1}, + {0xa7d8u, {0xa7d9u, 0x0u, 0x0u}, 1}, + {0xa7dau, {0xa7dbu, 0x0u, 0x0u}, 1}, + {0xa7dcu, {0x19bu, 0x0u, 0x0u}, 1}, + {0xa7f5u, {0xa7f6u, 0x0u, 0x0u}, 1}, + {0xff21u, {0xff41u, 0x0u, 0x0u}, 1}, + {0xff22u, {0xff42u, 0x0u, 0x0u}, 1}, + {0xff23u, {0xff43u, 0x0u, 0x0u}, 1}, + {0xff24u, {0xff44u, 0x0u, 0x0u}, 1}, + {0xff25u, {0xff45u, 0x0u, 0x0u}, 1}, + {0xff26u, {0xff46u, 0x0u, 0x0u}, 1}, + {0xff27u, {0xff47u, 0x0u, 0x0u}, 1}, + {0xff28u, {0xff48u, 0x0u, 0x0u}, 1}, + {0xff29u, {0xff49u, 0x0u, 0x0u}, 1}, + {0xff2au, {0xff4au, 0x0u, 0x0u}, 1}, + {0xff2bu, {0xff4bu, 0x0u, 0x0u}, 1}, + {0xff2cu, {0xff4cu, 0x0u, 0x0u}, 1}, + {0xff2du, {0xff4du, 0x0u, 0x0u}, 1}, + {0xff2eu, {0xff4eu, 0x0u, 0x0u}, 1}, + {0xff2fu, {0xff4fu, 0x0u, 0x0u}, 1}, + {0xff30u, {0xff50u, 0x0u, 0x0u}, 1}, + {0xff31u, {0xff51u, 0x0u, 0x0u}, 1}, + {0xff32u, {0xff52u, 0x0u, 0x0u}, 1}, + {0xff33u, {0xff53u, 0x0u, 0x0u}, 1}, + {0xff34u, {0xff54u, 0x0u, 0x0u}, 1}, + {0xff35u, {0xff55u, 0x0u, 0x0u}, 1}, + {0xff36u, {0xff56u, 0x0u, 0x0u}, 1}, + {0xff37u, {0xff57u, 0x0u, 0x0u}, 1}, + {0xff38u, {0xff58u, 0x0u, 0x0u}, 1}, + {0xff39u, {0xff59u, 0x0u, 0x0u}, 1}, + {0xff3au, {0xff5au, 0x0u, 0x0u}, 1}, + {0x10400u, {0x10428u, 0x0u, 0x0u}, 1}, + {0x10401u, {0x10429u, 0x0u, 0x0u}, 1}, + {0x10402u, {0x1042au, 0x0u, 0x0u}, 1}, + {0x10403u, {0x1042bu, 0x0u, 0x0u}, 1}, + {0x10404u, {0x1042cu, 0x0u, 0x0u}, 1}, + {0x10405u, {0x1042du, 0x0u, 0x0u}, 1}, + {0x10406u, {0x1042eu, 0x0u, 0x0u}, 1}, + {0x10407u, {0x1042fu, 0x0u, 0x0u}, 1}, + {0x10408u, {0x10430u, 0x0u, 0x0u}, 1}, + {0x10409u, {0x10431u, 0x0u, 0x0u}, 1}, + {0x1040au, {0x10432u, 0x0u, 0x0u}, 1}, + {0x1040bu, {0x10433u, 0x0u, 0x0u}, 1}, + {0x1040cu, {0x10434u, 0x0u, 0x0u}, 1}, + {0x1040du, {0x10435u, 0x0u, 0x0u}, 1}, + {0x1040eu, {0x10436u, 0x0u, 0x0u}, 1}, + {0x1040fu, {0x10437u, 0x0u, 0x0u}, 1}, + {0x10410u, {0x10438u, 0x0u, 0x0u}, 1}, + {0x10411u, {0x10439u, 0x0u, 0x0u}, 1}, + {0x10412u, {0x1043au, 0x0u, 0x0u}, 1}, + {0x10413u, {0x1043bu, 0x0u, 0x0u}, 1}, + {0x10414u, {0x1043cu, 0x0u, 0x0u}, 1}, + {0x10415u, {0x1043du, 0x0u, 0x0u}, 1}, + {0x10416u, {0x1043eu, 0x0u, 0x0u}, 1}, + {0x10417u, {0x1043fu, 0x0u, 0x0u}, 1}, + {0x10418u, {0x10440u, 0x0u, 0x0u}, 1}, + {0x10419u, {0x10441u, 0x0u, 0x0u}, 1}, + {0x1041au, {0x10442u, 0x0u, 0x0u}, 1}, + {0x1041bu, {0x10443u, 0x0u, 0x0u}, 1}, + {0x1041cu, {0x10444u, 0x0u, 0x0u}, 1}, + {0x1041du, {0x10445u, 0x0u, 0x0u}, 1}, + {0x1041eu, {0x10446u, 0x0u, 0x0u}, 1}, + {0x1041fu, {0x10447u, 0x0u, 0x0u}, 1}, + {0x10420u, {0x10448u, 0x0u, 0x0u}, 1}, + {0x10421u, {0x10449u, 0x0u, 0x0u}, 1}, + {0x10422u, {0x1044au, 0x0u, 0x0u}, 1}, + {0x10423u, {0x1044bu, 0x0u, 0x0u}, 1}, + {0x10424u, {0x1044cu, 0x0u, 0x0u}, 1}, + {0x10425u, {0x1044du, 0x0u, 0x0u}, 1}, + {0x10426u, {0x1044eu, 0x0u, 0x0u}, 1}, + {0x10427u, {0x1044fu, 0x0u, 0x0u}, 1}, + {0x104b0u, {0x104d8u, 0x0u, 0x0u}, 1}, + {0x104b1u, {0x104d9u, 0x0u, 0x0u}, 1}, + {0x104b2u, {0x104dau, 0x0u, 0x0u}, 1}, + {0x104b3u, {0x104dbu, 0x0u, 0x0u}, 1}, + {0x104b4u, {0x104dcu, 0x0u, 0x0u}, 1}, + {0x104b5u, {0x104ddu, 0x0u, 0x0u}, 1}, + {0x104b6u, {0x104deu, 0x0u, 0x0u}, 1}, + {0x104b7u, {0x104dfu, 0x0u, 0x0u}, 1}, + {0x104b8u, {0x104e0u, 0x0u, 0x0u}, 1}, + {0x104b9u, {0x104e1u, 0x0u, 0x0u}, 1}, + {0x104bau, {0x104e2u, 0x0u, 0x0u}, 1}, + {0x104bbu, {0x104e3u, 0x0u, 0x0u}, 1}, + {0x104bcu, {0x104e4u, 0x0u, 0x0u}, 1}, + {0x104bdu, {0x104e5u, 0x0u, 0x0u}, 1}, + {0x104beu, {0x104e6u, 0x0u, 0x0u}, 1}, + {0x104bfu, {0x104e7u, 0x0u, 0x0u}, 1}, + {0x104c0u, {0x104e8u, 0x0u, 0x0u}, 1}, + {0x104c1u, {0x104e9u, 0x0u, 0x0u}, 1}, + {0x104c2u, {0x104eau, 0x0u, 0x0u}, 1}, + {0x104c3u, {0x104ebu, 0x0u, 0x0u}, 1}, + {0x104c4u, {0x104ecu, 0x0u, 0x0u}, 1}, + {0x104c5u, {0x104edu, 0x0u, 0x0u}, 1}, + {0x104c6u, {0x104eeu, 0x0u, 0x0u}, 1}, + {0x104c7u, {0x104efu, 0x0u, 0x0u}, 1}, + {0x104c8u, {0x104f0u, 0x0u, 0x0u}, 1}, + {0x104c9u, {0x104f1u, 0x0u, 0x0u}, 1}, + {0x104cau, {0x104f2u, 0x0u, 0x0u}, 1}, + {0x104cbu, {0x104f3u, 0x0u, 0x0u}, 1}, + {0x104ccu, {0x104f4u, 0x0u, 0x0u}, 1}, + {0x104cdu, {0x104f5u, 0x0u, 0x0u}, 1}, + {0x104ceu, {0x104f6u, 0x0u, 0x0u}, 1}, + {0x104cfu, {0x104f7u, 0x0u, 0x0u}, 1}, + {0x104d0u, {0x104f8u, 0x0u, 0x0u}, 1}, + {0x104d1u, {0x104f9u, 0x0u, 0x0u}, 1}, + {0x104d2u, {0x104fau, 0x0u, 0x0u}, 1}, + {0x104d3u, {0x104fbu, 0x0u, 0x0u}, 1}, + {0x10570u, {0x10597u, 0x0u, 0x0u}, 1}, + {0x10571u, {0x10598u, 0x0u, 0x0u}, 1}, + {0x10572u, {0x10599u, 0x0u, 0x0u}, 1}, + {0x10573u, {0x1059au, 0x0u, 0x0u}, 1}, + {0x10574u, {0x1059bu, 0x0u, 0x0u}, 1}, + {0x10575u, {0x1059cu, 0x0u, 0x0u}, 1}, + {0x10576u, {0x1059du, 0x0u, 0x0u}, 1}, + {0x10577u, {0x1059eu, 0x0u, 0x0u}, 1}, + {0x10578u, {0x1059fu, 0x0u, 0x0u}, 1}, + {0x10579u, {0x105a0u, 0x0u, 0x0u}, 1}, + {0x1057au, {0x105a1u, 0x0u, 0x0u}, 1}, + {0x1057cu, {0x105a3u, 0x0u, 0x0u}, 1}, + {0x1057du, {0x105a4u, 0x0u, 0x0u}, 1}, + {0x1057eu, {0x105a5u, 0x0u, 0x0u}, 1}, + {0x1057fu, {0x105a6u, 0x0u, 0x0u}, 1}, + {0x10580u, {0x105a7u, 0x0u, 0x0u}, 1}, + {0x10581u, {0x105a8u, 0x0u, 0x0u}, 1}, + {0x10582u, {0x105a9u, 0x0u, 0x0u}, 1}, + {0x10583u, {0x105aau, 0x0u, 0x0u}, 1}, + {0x10584u, {0x105abu, 0x0u, 0x0u}, 1}, + {0x10585u, {0x105acu, 0x0u, 0x0u}, 1}, + {0x10586u, {0x105adu, 0x0u, 0x0u}, 1}, + {0x10587u, {0x105aeu, 0x0u, 0x0u}, 1}, + {0x10588u, {0x105afu, 0x0u, 0x0u}, 1}, + {0x10589u, {0x105b0u, 0x0u, 0x0u}, 1}, + {0x1058au, {0x105b1u, 0x0u, 0x0u}, 1}, + {0x1058cu, {0x105b3u, 0x0u, 0x0u}, 1}, + {0x1058du, {0x105b4u, 0x0u, 0x0u}, 1}, + {0x1058eu, {0x105b5u, 0x0u, 0x0u}, 1}, + {0x1058fu, {0x105b6u, 0x0u, 0x0u}, 1}, + {0x10590u, {0x105b7u, 0x0u, 0x0u}, 1}, + {0x10591u, {0x105b8u, 0x0u, 0x0u}, 1}, + {0x10592u, {0x105b9u, 0x0u, 0x0u}, 1}, + {0x10594u, {0x105bbu, 0x0u, 0x0u}, 1}, + {0x10595u, {0x105bcu, 0x0u, 0x0u}, 1}, + {0x10c80u, {0x10cc0u, 0x0u, 0x0u}, 1}, + {0x10c81u, {0x10cc1u, 0x0u, 0x0u}, 1}, + {0x10c82u, {0x10cc2u, 0x0u, 0x0u}, 1}, + {0x10c83u, {0x10cc3u, 0x0u, 0x0u}, 1}, + {0x10c84u, {0x10cc4u, 0x0u, 0x0u}, 1}, + {0x10c85u, {0x10cc5u, 0x0u, 0x0u}, 1}, + {0x10c86u, {0x10cc6u, 0x0u, 0x0u}, 1}, + {0x10c87u, {0x10cc7u, 0x0u, 0x0u}, 1}, + {0x10c88u, {0x10cc8u, 0x0u, 0x0u}, 1}, + {0x10c89u, {0x10cc9u, 0x0u, 0x0u}, 1}, + {0x10c8au, {0x10ccau, 0x0u, 0x0u}, 1}, + {0x10c8bu, {0x10ccbu, 0x0u, 0x0u}, 1}, + {0x10c8cu, {0x10cccu, 0x0u, 0x0u}, 1}, + {0x10c8du, {0x10ccdu, 0x0u, 0x0u}, 1}, + {0x10c8eu, {0x10cceu, 0x0u, 0x0u}, 1}, + {0x10c8fu, {0x10ccfu, 0x0u, 0x0u}, 1}, + {0x10c90u, {0x10cd0u, 0x0u, 0x0u}, 1}, + {0x10c91u, {0x10cd1u, 0x0u, 0x0u}, 1}, + {0x10c92u, {0x10cd2u, 0x0u, 0x0u}, 1}, + {0x10c93u, {0x10cd3u, 0x0u, 0x0u}, 1}, + {0x10c94u, {0x10cd4u, 0x0u, 0x0u}, 1}, + {0x10c95u, {0x10cd5u, 0x0u, 0x0u}, 1}, + {0x10c96u, {0x10cd6u, 0x0u, 0x0u}, 1}, + {0x10c97u, {0x10cd7u, 0x0u, 0x0u}, 1}, + {0x10c98u, {0x10cd8u, 0x0u, 0x0u}, 1}, + {0x10c99u, {0x10cd9u, 0x0u, 0x0u}, 1}, + {0x10c9au, {0x10cdau, 0x0u, 0x0u}, 1}, + {0x10c9bu, {0x10cdbu, 0x0u, 0x0u}, 1}, + {0x10c9cu, {0x10cdcu, 0x0u, 0x0u}, 1}, + {0x10c9du, {0x10cddu, 0x0u, 0x0u}, 1}, + {0x10c9eu, {0x10cdeu, 0x0u, 0x0u}, 1}, + {0x10c9fu, {0x10cdfu, 0x0u, 0x0u}, 1}, + {0x10ca0u, {0x10ce0u, 0x0u, 0x0u}, 1}, + {0x10ca1u, {0x10ce1u, 0x0u, 0x0u}, 1}, + {0x10ca2u, {0x10ce2u, 0x0u, 0x0u}, 1}, + {0x10ca3u, {0x10ce3u, 0x0u, 0x0u}, 1}, + {0x10ca4u, {0x10ce4u, 0x0u, 0x0u}, 1}, + {0x10ca5u, {0x10ce5u, 0x0u, 0x0u}, 1}, + {0x10ca6u, {0x10ce6u, 0x0u, 0x0u}, 1}, + {0x10ca7u, {0x10ce7u, 0x0u, 0x0u}, 1}, + {0x10ca8u, {0x10ce8u, 0x0u, 0x0u}, 1}, + {0x10ca9u, {0x10ce9u, 0x0u, 0x0u}, 1}, + {0x10caau, {0x10ceau, 0x0u, 0x0u}, 1}, + {0x10cabu, {0x10cebu, 0x0u, 0x0u}, 1}, + {0x10cacu, {0x10cecu, 0x0u, 0x0u}, 1}, + {0x10cadu, {0x10cedu, 0x0u, 0x0u}, 1}, + {0x10caeu, {0x10ceeu, 0x0u, 0x0u}, 1}, + {0x10cafu, {0x10cefu, 0x0u, 0x0u}, 1}, + {0x10cb0u, {0x10cf0u, 0x0u, 0x0u}, 1}, + {0x10cb1u, {0x10cf1u, 0x0u, 0x0u}, 1}, + {0x10cb2u, {0x10cf2u, 0x0u, 0x0u}, 1}, + {0x10d50u, {0x10d70u, 0x0u, 0x0u}, 1}, + {0x10d51u, {0x10d71u, 0x0u, 0x0u}, 1}, + {0x10d52u, {0x10d72u, 0x0u, 0x0u}, 1}, + {0x10d53u, {0x10d73u, 0x0u, 0x0u}, 1}, + {0x10d54u, {0x10d74u, 0x0u, 0x0u}, 1}, + {0x10d55u, {0x10d75u, 0x0u, 0x0u}, 1}, + {0x10d56u, {0x10d76u, 0x0u, 0x0u}, 1}, + {0x10d57u, {0x10d77u, 0x0u, 0x0u}, 1}, + {0x10d58u, {0x10d78u, 0x0u, 0x0u}, 1}, + {0x10d59u, {0x10d79u, 0x0u, 0x0u}, 1}, + {0x10d5au, {0x10d7au, 0x0u, 0x0u}, 1}, + {0x10d5bu, {0x10d7bu, 0x0u, 0x0u}, 1}, + {0x10d5cu, {0x10d7cu, 0x0u, 0x0u}, 1}, + {0x10d5du, {0x10d7du, 0x0u, 0x0u}, 1}, + {0x10d5eu, {0x10d7eu, 0x0u, 0x0u}, 1}, + {0x10d5fu, {0x10d7fu, 0x0u, 0x0u}, 1}, + {0x10d60u, {0x10d80u, 0x0u, 0x0u}, 1}, + {0x10d61u, {0x10d81u, 0x0u, 0x0u}, 1}, + {0x10d62u, {0x10d82u, 0x0u, 0x0u}, 1}, + {0x10d63u, {0x10d83u, 0x0u, 0x0u}, 1}, + {0x10d64u, {0x10d84u, 0x0u, 0x0u}, 1}, + {0x10d65u, {0x10d85u, 0x0u, 0x0u}, 1}, + {0x118a0u, {0x118c0u, 0x0u, 0x0u}, 1}, + {0x118a1u, {0x118c1u, 0x0u, 0x0u}, 1}, + {0x118a2u, {0x118c2u, 0x0u, 0x0u}, 1}, + {0x118a3u, {0x118c3u, 0x0u, 0x0u}, 1}, + {0x118a4u, {0x118c4u, 0x0u, 0x0u}, 1}, + {0x118a5u, {0x118c5u, 0x0u, 0x0u}, 1}, + {0x118a6u, {0x118c6u, 0x0u, 0x0u}, 1}, + {0x118a7u, {0x118c7u, 0x0u, 0x0u}, 1}, + {0x118a8u, {0x118c8u, 0x0u, 0x0u}, 1}, + {0x118a9u, {0x118c9u, 0x0u, 0x0u}, 1}, + {0x118aau, {0x118cau, 0x0u, 0x0u}, 1}, + {0x118abu, {0x118cbu, 0x0u, 0x0u}, 1}, + {0x118acu, {0x118ccu, 0x0u, 0x0u}, 1}, + {0x118adu, {0x118cdu, 0x0u, 0x0u}, 1}, + {0x118aeu, {0x118ceu, 0x0u, 0x0u}, 1}, + {0x118afu, {0x118cfu, 0x0u, 0x0u}, 1}, + {0x118b0u, {0x118d0u, 0x0u, 0x0u}, 1}, + {0x118b1u, {0x118d1u, 0x0u, 0x0u}, 1}, + {0x118b2u, {0x118d2u, 0x0u, 0x0u}, 1}, + {0x118b3u, {0x118d3u, 0x0u, 0x0u}, 1}, + {0x118b4u, {0x118d4u, 0x0u, 0x0u}, 1}, + {0x118b5u, {0x118d5u, 0x0u, 0x0u}, 1}, + {0x118b6u, {0x118d6u, 0x0u, 0x0u}, 1}, + {0x118b7u, {0x118d7u, 0x0u, 0x0u}, 1}, + {0x118b8u, {0x118d8u, 0x0u, 0x0u}, 1}, + {0x118b9u, {0x118d9u, 0x0u, 0x0u}, 1}, + {0x118bau, {0x118dau, 0x0u, 0x0u}, 1}, + {0x118bbu, {0x118dbu, 0x0u, 0x0u}, 1}, + {0x118bcu, {0x118dcu, 0x0u, 0x0u}, 1}, + {0x118bdu, {0x118ddu, 0x0u, 0x0u}, 1}, + {0x118beu, {0x118deu, 0x0u, 0x0u}, 1}, + {0x118bfu, {0x118dfu, 0x0u, 0x0u}, 1}, + {0x16e40u, {0x16e60u, 0x0u, 0x0u}, 1}, + {0x16e41u, {0x16e61u, 0x0u, 0x0u}, 1}, + {0x16e42u, {0x16e62u, 0x0u, 0x0u}, 1}, + {0x16e43u, {0x16e63u, 0x0u, 0x0u}, 1}, + {0x16e44u, {0x16e64u, 0x0u, 0x0u}, 1}, + {0x16e45u, {0x16e65u, 0x0u, 0x0u}, 1}, + {0x16e46u, {0x16e66u, 0x0u, 0x0u}, 1}, + {0x16e47u, {0x16e67u, 0x0u, 0x0u}, 1}, + {0x16e48u, {0x16e68u, 0x0u, 0x0u}, 1}, + {0x16e49u, {0x16e69u, 0x0u, 0x0u}, 1}, + {0x16e4au, {0x16e6au, 0x0u, 0x0u}, 1}, + {0x16e4bu, {0x16e6bu, 0x0u, 0x0u}, 1}, + {0x16e4cu, {0x16e6cu, 0x0u, 0x0u}, 1}, + {0x16e4du, {0x16e6du, 0x0u, 0x0u}, 1}, + {0x16e4eu, {0x16e6eu, 0x0u, 0x0u}, 1}, + {0x16e4fu, {0x16e6fu, 0x0u, 0x0u}, 1}, + {0x16e50u, {0x16e70u, 0x0u, 0x0u}, 1}, + {0x16e51u, {0x16e71u, 0x0u, 0x0u}, 1}, + {0x16e52u, {0x16e72u, 0x0u, 0x0u}, 1}, + {0x16e53u, {0x16e73u, 0x0u, 0x0u}, 1}, + {0x16e54u, {0x16e74u, 0x0u, 0x0u}, 1}, + {0x16e55u, {0x16e75u, 0x0u, 0x0u}, 1}, + {0x16e56u, {0x16e76u, 0x0u, 0x0u}, 1}, + {0x16e57u, {0x16e77u, 0x0u, 0x0u}, 1}, + {0x16e58u, {0x16e78u, 0x0u, 0x0u}, 1}, + {0x16e59u, {0x16e79u, 0x0u, 0x0u}, 1}, + {0x16e5au, {0x16e7au, 0x0u, 0x0u}, 1}, + {0x16e5bu, {0x16e7bu, 0x0u, 0x0u}, 1}, + {0x16e5cu, {0x16e7cu, 0x0u, 0x0u}, 1}, + {0x16e5du, {0x16e7du, 0x0u, 0x0u}, 1}, + {0x16e5eu, {0x16e7eu, 0x0u, 0x0u}, 1}, + {0x16e5fu, {0x16e7fu, 0x0u, 0x0u}, 1}, + {0x16ea0u, {0x16ebbu, 0x0u, 0x0u}, 1}, + {0x16ea1u, {0x16ebcu, 0x0u, 0x0u}, 1}, + {0x16ea2u, {0x16ebdu, 0x0u, 0x0u}, 1}, + {0x16ea3u, {0x16ebeu, 0x0u, 0x0u}, 1}, + {0x16ea4u, {0x16ebfu, 0x0u, 0x0u}, 1}, + {0x16ea5u, {0x16ec0u, 0x0u, 0x0u}, 1}, + {0x16ea6u, {0x16ec1u, 0x0u, 0x0u}, 1}, + {0x16ea7u, {0x16ec2u, 0x0u, 0x0u}, 1}, + {0x16ea8u, {0x16ec3u, 0x0u, 0x0u}, 1}, + {0x16ea9u, {0x16ec4u, 0x0u, 0x0u}, 1}, + {0x16eaau, {0x16ec5u, 0x0u, 0x0u}, 1}, + {0x16eabu, {0x16ec6u, 0x0u, 0x0u}, 1}, + {0x16eacu, {0x16ec7u, 0x0u, 0x0u}, 1}, + {0x16eadu, {0x16ec8u, 0x0u, 0x0u}, 1}, + {0x16eaeu, {0x16ec9u, 0x0u, 0x0u}, 1}, + {0x16eafu, {0x16ecau, 0x0u, 0x0u}, 1}, + {0x16eb0u, {0x16ecbu, 0x0u, 0x0u}, 1}, + {0x16eb1u, {0x16eccu, 0x0u, 0x0u}, 1}, + {0x16eb2u, {0x16ecdu, 0x0u, 0x0u}, 1}, + {0x16eb3u, {0x16eceu, 0x0u, 0x0u}, 1}, + {0x16eb4u, {0x16ecfu, 0x0u, 0x0u}, 1}, + {0x16eb5u, {0x16ed0u, 0x0u, 0x0u}, 1}, + {0x16eb6u, {0x16ed1u, 0x0u, 0x0u}, 1}, + {0x16eb7u, {0x16ed2u, 0x0u, 0x0u}, 1}, + {0x16eb8u, {0x16ed3u, 0x0u, 0x0u}, 1}, + {0x1e900u, {0x1e922u, 0x0u, 0x0u}, 1}, + {0x1e901u, {0x1e923u, 0x0u, 0x0u}, 1}, + {0x1e902u, {0x1e924u, 0x0u, 0x0u}, 1}, + {0x1e903u, {0x1e925u, 0x0u, 0x0u}, 1}, + {0x1e904u, {0x1e926u, 0x0u, 0x0u}, 1}, + {0x1e905u, {0x1e927u, 0x0u, 0x0u}, 1}, + {0x1e906u, {0x1e928u, 0x0u, 0x0u}, 1}, + {0x1e907u, {0x1e929u, 0x0u, 0x0u}, 1}, + {0x1e908u, {0x1e92au, 0x0u, 0x0u}, 1}, + {0x1e909u, {0x1e92bu, 0x0u, 0x0u}, 1}, + {0x1e90au, {0x1e92cu, 0x0u, 0x0u}, 1}, + {0x1e90bu, {0x1e92du, 0x0u, 0x0u}, 1}, + {0x1e90cu, {0x1e92eu, 0x0u, 0x0u}, 1}, + {0x1e90du, {0x1e92fu, 0x0u, 0x0u}, 1}, + {0x1e90eu, {0x1e930u, 0x0u, 0x0u}, 1}, + {0x1e90fu, {0x1e931u, 0x0u, 0x0u}, 1}, + {0x1e910u, {0x1e932u, 0x0u, 0x0u}, 1}, + {0x1e911u, {0x1e933u, 0x0u, 0x0u}, 1}, + {0x1e912u, {0x1e934u, 0x0u, 0x0u}, 1}, + {0x1e913u, {0x1e935u, 0x0u, 0x0u}, 1}, + {0x1e914u, {0x1e936u, 0x0u, 0x0u}, 1}, + {0x1e915u, {0x1e937u, 0x0u, 0x0u}, 1}, + {0x1e916u, {0x1e938u, 0x0u, 0x0u}, 1}, + {0x1e917u, {0x1e939u, 0x0u, 0x0u}, 1}, + {0x1e918u, {0x1e93au, 0x0u, 0x0u}, 1}, + {0x1e919u, {0x1e93bu, 0x0u, 0x0u}, 1}, + {0x1e91au, {0x1e93cu, 0x0u, 0x0u}, 1}, + {0x1e91bu, {0x1e93du, 0x0u, 0x0u}, 1}, + {0x1e91cu, {0x1e93eu, 0x0u, 0x0u}, 1}, + {0x1e91du, {0x1e93fu, 0x0u, 0x0u}, 1}, + {0x1e91eu, {0x1e940u, 0x0u, 0x0u}, 1}, + {0x1e91fu, {0x1e941u, 0x0u, 0x0u}, 1}, + {0x1e920u, {0x1e942u, 0x0u, 0x0u}, 1}, + {0x1e921u, {0x1e943u, 0x0u, 0x0u}, 1}, +}; +static const int kZeroLowerMapLen = 1488; + +static const ZeroCaseMap kZeroUpperMap[] = { + {0x61u, {0x41u, 0x0u, 0x0u}, 1}, + {0x62u, {0x42u, 0x0u, 0x0u}, 1}, + {0x63u, {0x43u, 0x0u, 0x0u}, 1}, + {0x64u, {0x44u, 0x0u, 0x0u}, 1}, + {0x65u, {0x45u, 0x0u, 0x0u}, 1}, + {0x66u, {0x46u, 0x0u, 0x0u}, 1}, + {0x67u, {0x47u, 0x0u, 0x0u}, 1}, + {0x68u, {0x48u, 0x0u, 0x0u}, 1}, + {0x69u, {0x49u, 0x0u, 0x0u}, 1}, + {0x6au, {0x4au, 0x0u, 0x0u}, 1}, + {0x6bu, {0x4bu, 0x0u, 0x0u}, 1}, + {0x6cu, {0x4cu, 0x0u, 0x0u}, 1}, + {0x6du, {0x4du, 0x0u, 0x0u}, 1}, + {0x6eu, {0x4eu, 0x0u, 0x0u}, 1}, + {0x6fu, {0x4fu, 0x0u, 0x0u}, 1}, + {0x70u, {0x50u, 0x0u, 0x0u}, 1}, + {0x71u, {0x51u, 0x0u, 0x0u}, 1}, + {0x72u, {0x52u, 0x0u, 0x0u}, 1}, + {0x73u, {0x53u, 0x0u, 0x0u}, 1}, + {0x74u, {0x54u, 0x0u, 0x0u}, 1}, + {0x75u, {0x55u, 0x0u, 0x0u}, 1}, + {0x76u, {0x56u, 0x0u, 0x0u}, 1}, + {0x77u, {0x57u, 0x0u, 0x0u}, 1}, + {0x78u, {0x58u, 0x0u, 0x0u}, 1}, + {0x79u, {0x59u, 0x0u, 0x0u}, 1}, + {0x7au, {0x5au, 0x0u, 0x0u}, 1}, + {0xb5u, {0x39cu, 0x0u, 0x0u}, 1}, + {0xdfu, {0x53u, 0x53u, 0x0u}, 2}, + {0xe0u, {0xc0u, 0x0u, 0x0u}, 1}, + {0xe1u, {0xc1u, 0x0u, 0x0u}, 1}, + {0xe2u, {0xc2u, 0x0u, 0x0u}, 1}, + {0xe3u, {0xc3u, 0x0u, 0x0u}, 1}, + {0xe4u, {0xc4u, 0x0u, 0x0u}, 1}, + {0xe5u, {0xc5u, 0x0u, 0x0u}, 1}, + {0xe6u, {0xc6u, 0x0u, 0x0u}, 1}, + {0xe7u, {0xc7u, 0x0u, 0x0u}, 1}, + {0xe8u, {0xc8u, 0x0u, 0x0u}, 1}, + {0xe9u, {0xc9u, 0x0u, 0x0u}, 1}, + {0xeau, {0xcau, 0x0u, 0x0u}, 1}, + {0xebu, {0xcbu, 0x0u, 0x0u}, 1}, + {0xecu, {0xccu, 0x0u, 0x0u}, 1}, + {0xedu, {0xcdu, 0x0u, 0x0u}, 1}, + {0xeeu, {0xceu, 0x0u, 0x0u}, 1}, + {0xefu, {0xcfu, 0x0u, 0x0u}, 1}, + {0xf0u, {0xd0u, 0x0u, 0x0u}, 1}, + {0xf1u, {0xd1u, 0x0u, 0x0u}, 1}, + {0xf2u, {0xd2u, 0x0u, 0x0u}, 1}, + {0xf3u, {0xd3u, 0x0u, 0x0u}, 1}, + {0xf4u, {0xd4u, 0x0u, 0x0u}, 1}, + {0xf5u, {0xd5u, 0x0u, 0x0u}, 1}, + {0xf6u, {0xd6u, 0x0u, 0x0u}, 1}, + {0xf8u, {0xd8u, 0x0u, 0x0u}, 1}, + {0xf9u, {0xd9u, 0x0u, 0x0u}, 1}, + {0xfau, {0xdau, 0x0u, 0x0u}, 1}, + {0xfbu, {0xdbu, 0x0u, 0x0u}, 1}, + {0xfcu, {0xdcu, 0x0u, 0x0u}, 1}, + {0xfdu, {0xddu, 0x0u, 0x0u}, 1}, + {0xfeu, {0xdeu, 0x0u, 0x0u}, 1}, + {0xffu, {0x178u, 0x0u, 0x0u}, 1}, + {0x101u, {0x100u, 0x0u, 0x0u}, 1}, + {0x103u, {0x102u, 0x0u, 0x0u}, 1}, + {0x105u, {0x104u, 0x0u, 0x0u}, 1}, + {0x107u, {0x106u, 0x0u, 0x0u}, 1}, + {0x109u, {0x108u, 0x0u, 0x0u}, 1}, + {0x10bu, {0x10au, 0x0u, 0x0u}, 1}, + {0x10du, {0x10cu, 0x0u, 0x0u}, 1}, + {0x10fu, {0x10eu, 0x0u, 0x0u}, 1}, + {0x111u, {0x110u, 0x0u, 0x0u}, 1}, + {0x113u, {0x112u, 0x0u, 0x0u}, 1}, + {0x115u, {0x114u, 0x0u, 0x0u}, 1}, + {0x117u, {0x116u, 0x0u, 0x0u}, 1}, + {0x119u, {0x118u, 0x0u, 0x0u}, 1}, + {0x11bu, {0x11au, 0x0u, 0x0u}, 1}, + {0x11du, {0x11cu, 0x0u, 0x0u}, 1}, + {0x11fu, {0x11eu, 0x0u, 0x0u}, 1}, + {0x121u, {0x120u, 0x0u, 0x0u}, 1}, + {0x123u, {0x122u, 0x0u, 0x0u}, 1}, + {0x125u, {0x124u, 0x0u, 0x0u}, 1}, + {0x127u, {0x126u, 0x0u, 0x0u}, 1}, + {0x129u, {0x128u, 0x0u, 0x0u}, 1}, + {0x12bu, {0x12au, 0x0u, 0x0u}, 1}, + {0x12du, {0x12cu, 0x0u, 0x0u}, 1}, + {0x12fu, {0x12eu, 0x0u, 0x0u}, 1}, + {0x131u, {0x49u, 0x0u, 0x0u}, 1}, + {0x133u, {0x132u, 0x0u, 0x0u}, 1}, + {0x135u, {0x134u, 0x0u, 0x0u}, 1}, + {0x137u, {0x136u, 0x0u, 0x0u}, 1}, + {0x13au, {0x139u, 0x0u, 0x0u}, 1}, + {0x13cu, {0x13bu, 0x0u, 0x0u}, 1}, + {0x13eu, {0x13du, 0x0u, 0x0u}, 1}, + {0x140u, {0x13fu, 0x0u, 0x0u}, 1}, + {0x142u, {0x141u, 0x0u, 0x0u}, 1}, + {0x144u, {0x143u, 0x0u, 0x0u}, 1}, + {0x146u, {0x145u, 0x0u, 0x0u}, 1}, + {0x148u, {0x147u, 0x0u, 0x0u}, 1}, + {0x149u, {0x2bcu, 0x4eu, 0x0u}, 2}, + {0x14bu, {0x14au, 0x0u, 0x0u}, 1}, + {0x14du, {0x14cu, 0x0u, 0x0u}, 1}, + {0x14fu, {0x14eu, 0x0u, 0x0u}, 1}, + {0x151u, {0x150u, 0x0u, 0x0u}, 1}, + {0x153u, {0x152u, 0x0u, 0x0u}, 1}, + {0x155u, {0x154u, 0x0u, 0x0u}, 1}, + {0x157u, {0x156u, 0x0u, 0x0u}, 1}, + {0x159u, {0x158u, 0x0u, 0x0u}, 1}, + {0x15bu, {0x15au, 0x0u, 0x0u}, 1}, + {0x15du, {0x15cu, 0x0u, 0x0u}, 1}, + {0x15fu, {0x15eu, 0x0u, 0x0u}, 1}, + {0x161u, {0x160u, 0x0u, 0x0u}, 1}, + {0x163u, {0x162u, 0x0u, 0x0u}, 1}, + {0x165u, {0x164u, 0x0u, 0x0u}, 1}, + {0x167u, {0x166u, 0x0u, 0x0u}, 1}, + {0x169u, {0x168u, 0x0u, 0x0u}, 1}, + {0x16bu, {0x16au, 0x0u, 0x0u}, 1}, + {0x16du, {0x16cu, 0x0u, 0x0u}, 1}, + {0x16fu, {0x16eu, 0x0u, 0x0u}, 1}, + {0x171u, {0x170u, 0x0u, 0x0u}, 1}, + {0x173u, {0x172u, 0x0u, 0x0u}, 1}, + {0x175u, {0x174u, 0x0u, 0x0u}, 1}, + {0x177u, {0x176u, 0x0u, 0x0u}, 1}, + {0x17au, {0x179u, 0x0u, 0x0u}, 1}, + {0x17cu, {0x17bu, 0x0u, 0x0u}, 1}, + {0x17eu, {0x17du, 0x0u, 0x0u}, 1}, + {0x17fu, {0x53u, 0x0u, 0x0u}, 1}, + {0x180u, {0x243u, 0x0u, 0x0u}, 1}, + {0x183u, {0x182u, 0x0u, 0x0u}, 1}, + {0x185u, {0x184u, 0x0u, 0x0u}, 1}, + {0x188u, {0x187u, 0x0u, 0x0u}, 1}, + {0x18cu, {0x18bu, 0x0u, 0x0u}, 1}, + {0x192u, {0x191u, 0x0u, 0x0u}, 1}, + {0x195u, {0x1f6u, 0x0u, 0x0u}, 1}, + {0x199u, {0x198u, 0x0u, 0x0u}, 1}, + {0x19au, {0x23du, 0x0u, 0x0u}, 1}, + {0x19bu, {0xa7dcu, 0x0u, 0x0u}, 1}, + {0x19eu, {0x220u, 0x0u, 0x0u}, 1}, + {0x1a1u, {0x1a0u, 0x0u, 0x0u}, 1}, + {0x1a3u, {0x1a2u, 0x0u, 0x0u}, 1}, + {0x1a5u, {0x1a4u, 0x0u, 0x0u}, 1}, + {0x1a8u, {0x1a7u, 0x0u, 0x0u}, 1}, + {0x1adu, {0x1acu, 0x0u, 0x0u}, 1}, + {0x1b0u, {0x1afu, 0x0u, 0x0u}, 1}, + {0x1b4u, {0x1b3u, 0x0u, 0x0u}, 1}, + {0x1b6u, {0x1b5u, 0x0u, 0x0u}, 1}, + {0x1b9u, {0x1b8u, 0x0u, 0x0u}, 1}, + {0x1bdu, {0x1bcu, 0x0u, 0x0u}, 1}, + {0x1bfu, {0x1f7u, 0x0u, 0x0u}, 1}, + {0x1c5u, {0x1c4u, 0x0u, 0x0u}, 1}, + {0x1c6u, {0x1c4u, 0x0u, 0x0u}, 1}, + {0x1c8u, {0x1c7u, 0x0u, 0x0u}, 1}, + {0x1c9u, {0x1c7u, 0x0u, 0x0u}, 1}, + {0x1cbu, {0x1cau, 0x0u, 0x0u}, 1}, + {0x1ccu, {0x1cau, 0x0u, 0x0u}, 1}, + {0x1ceu, {0x1cdu, 0x0u, 0x0u}, 1}, + {0x1d0u, {0x1cfu, 0x0u, 0x0u}, 1}, + {0x1d2u, {0x1d1u, 0x0u, 0x0u}, 1}, + {0x1d4u, {0x1d3u, 0x0u, 0x0u}, 1}, + {0x1d6u, {0x1d5u, 0x0u, 0x0u}, 1}, + {0x1d8u, {0x1d7u, 0x0u, 0x0u}, 1}, + {0x1dau, {0x1d9u, 0x0u, 0x0u}, 1}, + {0x1dcu, {0x1dbu, 0x0u, 0x0u}, 1}, + {0x1ddu, {0x18eu, 0x0u, 0x0u}, 1}, + {0x1dfu, {0x1deu, 0x0u, 0x0u}, 1}, + {0x1e1u, {0x1e0u, 0x0u, 0x0u}, 1}, + {0x1e3u, {0x1e2u, 0x0u, 0x0u}, 1}, + {0x1e5u, {0x1e4u, 0x0u, 0x0u}, 1}, + {0x1e7u, {0x1e6u, 0x0u, 0x0u}, 1}, + {0x1e9u, {0x1e8u, 0x0u, 0x0u}, 1}, + {0x1ebu, {0x1eau, 0x0u, 0x0u}, 1}, + {0x1edu, {0x1ecu, 0x0u, 0x0u}, 1}, + {0x1efu, {0x1eeu, 0x0u, 0x0u}, 1}, + {0x1f0u, {0x4au, 0x30cu, 0x0u}, 2}, + {0x1f2u, {0x1f1u, 0x0u, 0x0u}, 1}, + {0x1f3u, {0x1f1u, 0x0u, 0x0u}, 1}, + {0x1f5u, {0x1f4u, 0x0u, 0x0u}, 1}, + {0x1f9u, {0x1f8u, 0x0u, 0x0u}, 1}, + {0x1fbu, {0x1fau, 0x0u, 0x0u}, 1}, + {0x1fdu, {0x1fcu, 0x0u, 0x0u}, 1}, + {0x1ffu, {0x1feu, 0x0u, 0x0u}, 1}, + {0x201u, {0x200u, 0x0u, 0x0u}, 1}, + {0x203u, {0x202u, 0x0u, 0x0u}, 1}, + {0x205u, {0x204u, 0x0u, 0x0u}, 1}, + {0x207u, {0x206u, 0x0u, 0x0u}, 1}, + {0x209u, {0x208u, 0x0u, 0x0u}, 1}, + {0x20bu, {0x20au, 0x0u, 0x0u}, 1}, + {0x20du, {0x20cu, 0x0u, 0x0u}, 1}, + {0x20fu, {0x20eu, 0x0u, 0x0u}, 1}, + {0x211u, {0x210u, 0x0u, 0x0u}, 1}, + {0x213u, {0x212u, 0x0u, 0x0u}, 1}, + {0x215u, {0x214u, 0x0u, 0x0u}, 1}, + {0x217u, {0x216u, 0x0u, 0x0u}, 1}, + {0x219u, {0x218u, 0x0u, 0x0u}, 1}, + {0x21bu, {0x21au, 0x0u, 0x0u}, 1}, + {0x21du, {0x21cu, 0x0u, 0x0u}, 1}, + {0x21fu, {0x21eu, 0x0u, 0x0u}, 1}, + {0x223u, {0x222u, 0x0u, 0x0u}, 1}, + {0x225u, {0x224u, 0x0u, 0x0u}, 1}, + {0x227u, {0x226u, 0x0u, 0x0u}, 1}, + {0x229u, {0x228u, 0x0u, 0x0u}, 1}, + {0x22bu, {0x22au, 0x0u, 0x0u}, 1}, + {0x22du, {0x22cu, 0x0u, 0x0u}, 1}, + {0x22fu, {0x22eu, 0x0u, 0x0u}, 1}, + {0x231u, {0x230u, 0x0u, 0x0u}, 1}, + {0x233u, {0x232u, 0x0u, 0x0u}, 1}, + {0x23cu, {0x23bu, 0x0u, 0x0u}, 1}, + {0x23fu, {0x2c7eu, 0x0u, 0x0u}, 1}, + {0x240u, {0x2c7fu, 0x0u, 0x0u}, 1}, + {0x242u, {0x241u, 0x0u, 0x0u}, 1}, + {0x247u, {0x246u, 0x0u, 0x0u}, 1}, + {0x249u, {0x248u, 0x0u, 0x0u}, 1}, + {0x24bu, {0x24au, 0x0u, 0x0u}, 1}, + {0x24du, {0x24cu, 0x0u, 0x0u}, 1}, + {0x24fu, {0x24eu, 0x0u, 0x0u}, 1}, + {0x250u, {0x2c6fu, 0x0u, 0x0u}, 1}, + {0x251u, {0x2c6du, 0x0u, 0x0u}, 1}, + {0x252u, {0x2c70u, 0x0u, 0x0u}, 1}, + {0x253u, {0x181u, 0x0u, 0x0u}, 1}, + {0x254u, {0x186u, 0x0u, 0x0u}, 1}, + {0x256u, {0x189u, 0x0u, 0x0u}, 1}, + {0x257u, {0x18au, 0x0u, 0x0u}, 1}, + {0x259u, {0x18fu, 0x0u, 0x0u}, 1}, + {0x25bu, {0x190u, 0x0u, 0x0u}, 1}, + {0x25cu, {0xa7abu, 0x0u, 0x0u}, 1}, + {0x260u, {0x193u, 0x0u, 0x0u}, 1}, + {0x261u, {0xa7acu, 0x0u, 0x0u}, 1}, + {0x263u, {0x194u, 0x0u, 0x0u}, 1}, + {0x264u, {0xa7cbu, 0x0u, 0x0u}, 1}, + {0x265u, {0xa78du, 0x0u, 0x0u}, 1}, + {0x266u, {0xa7aau, 0x0u, 0x0u}, 1}, + {0x268u, {0x197u, 0x0u, 0x0u}, 1}, + {0x269u, {0x196u, 0x0u, 0x0u}, 1}, + {0x26au, {0xa7aeu, 0x0u, 0x0u}, 1}, + {0x26bu, {0x2c62u, 0x0u, 0x0u}, 1}, + {0x26cu, {0xa7adu, 0x0u, 0x0u}, 1}, + {0x26fu, {0x19cu, 0x0u, 0x0u}, 1}, + {0x271u, {0x2c6eu, 0x0u, 0x0u}, 1}, + {0x272u, {0x19du, 0x0u, 0x0u}, 1}, + {0x275u, {0x19fu, 0x0u, 0x0u}, 1}, + {0x27du, {0x2c64u, 0x0u, 0x0u}, 1}, + {0x280u, {0x1a6u, 0x0u, 0x0u}, 1}, + {0x282u, {0xa7c5u, 0x0u, 0x0u}, 1}, + {0x283u, {0x1a9u, 0x0u, 0x0u}, 1}, + {0x287u, {0xa7b1u, 0x0u, 0x0u}, 1}, + {0x288u, {0x1aeu, 0x0u, 0x0u}, 1}, + {0x289u, {0x244u, 0x0u, 0x0u}, 1}, + {0x28au, {0x1b1u, 0x0u, 0x0u}, 1}, + {0x28bu, {0x1b2u, 0x0u, 0x0u}, 1}, + {0x28cu, {0x245u, 0x0u, 0x0u}, 1}, + {0x292u, {0x1b7u, 0x0u, 0x0u}, 1}, + {0x29du, {0xa7b2u, 0x0u, 0x0u}, 1}, + {0x29eu, {0xa7b0u, 0x0u, 0x0u}, 1}, + {0x345u, {0x399u, 0x0u, 0x0u}, 1}, + {0x371u, {0x370u, 0x0u, 0x0u}, 1}, + {0x373u, {0x372u, 0x0u, 0x0u}, 1}, + {0x377u, {0x376u, 0x0u, 0x0u}, 1}, + {0x37bu, {0x3fdu, 0x0u, 0x0u}, 1}, + {0x37cu, {0x3feu, 0x0u, 0x0u}, 1}, + {0x37du, {0x3ffu, 0x0u, 0x0u}, 1}, + {0x390u, {0x399u, 0x308u, 0x301u}, 3}, + {0x3acu, {0x386u, 0x0u, 0x0u}, 1}, + {0x3adu, {0x388u, 0x0u, 0x0u}, 1}, + {0x3aeu, {0x389u, 0x0u, 0x0u}, 1}, + {0x3afu, {0x38au, 0x0u, 0x0u}, 1}, + {0x3b0u, {0x3a5u, 0x308u, 0x301u}, 3}, + {0x3b1u, {0x391u, 0x0u, 0x0u}, 1}, + {0x3b2u, {0x392u, 0x0u, 0x0u}, 1}, + {0x3b3u, {0x393u, 0x0u, 0x0u}, 1}, + {0x3b4u, {0x394u, 0x0u, 0x0u}, 1}, + {0x3b5u, {0x395u, 0x0u, 0x0u}, 1}, + {0x3b6u, {0x396u, 0x0u, 0x0u}, 1}, + {0x3b7u, {0x397u, 0x0u, 0x0u}, 1}, + {0x3b8u, {0x398u, 0x0u, 0x0u}, 1}, + {0x3b9u, {0x399u, 0x0u, 0x0u}, 1}, + {0x3bau, {0x39au, 0x0u, 0x0u}, 1}, + {0x3bbu, {0x39bu, 0x0u, 0x0u}, 1}, + {0x3bcu, {0x39cu, 0x0u, 0x0u}, 1}, + {0x3bdu, {0x39du, 0x0u, 0x0u}, 1}, + {0x3beu, {0x39eu, 0x0u, 0x0u}, 1}, + {0x3bfu, {0x39fu, 0x0u, 0x0u}, 1}, + {0x3c0u, {0x3a0u, 0x0u, 0x0u}, 1}, + {0x3c1u, {0x3a1u, 0x0u, 0x0u}, 1}, + {0x3c2u, {0x3a3u, 0x0u, 0x0u}, 1}, + {0x3c3u, {0x3a3u, 0x0u, 0x0u}, 1}, + {0x3c4u, {0x3a4u, 0x0u, 0x0u}, 1}, + {0x3c5u, {0x3a5u, 0x0u, 0x0u}, 1}, + {0x3c6u, {0x3a6u, 0x0u, 0x0u}, 1}, + {0x3c7u, {0x3a7u, 0x0u, 0x0u}, 1}, + {0x3c8u, {0x3a8u, 0x0u, 0x0u}, 1}, + {0x3c9u, {0x3a9u, 0x0u, 0x0u}, 1}, + {0x3cau, {0x3aau, 0x0u, 0x0u}, 1}, + {0x3cbu, {0x3abu, 0x0u, 0x0u}, 1}, + {0x3ccu, {0x38cu, 0x0u, 0x0u}, 1}, + {0x3cdu, {0x38eu, 0x0u, 0x0u}, 1}, + {0x3ceu, {0x38fu, 0x0u, 0x0u}, 1}, + {0x3d0u, {0x392u, 0x0u, 0x0u}, 1}, + {0x3d1u, {0x398u, 0x0u, 0x0u}, 1}, + {0x3d5u, {0x3a6u, 0x0u, 0x0u}, 1}, + {0x3d6u, {0x3a0u, 0x0u, 0x0u}, 1}, + {0x3d7u, {0x3cfu, 0x0u, 0x0u}, 1}, + {0x3d9u, {0x3d8u, 0x0u, 0x0u}, 1}, + {0x3dbu, {0x3dau, 0x0u, 0x0u}, 1}, + {0x3ddu, {0x3dcu, 0x0u, 0x0u}, 1}, + {0x3dfu, {0x3deu, 0x0u, 0x0u}, 1}, + {0x3e1u, {0x3e0u, 0x0u, 0x0u}, 1}, + {0x3e3u, {0x3e2u, 0x0u, 0x0u}, 1}, + {0x3e5u, {0x3e4u, 0x0u, 0x0u}, 1}, + {0x3e7u, {0x3e6u, 0x0u, 0x0u}, 1}, + {0x3e9u, {0x3e8u, 0x0u, 0x0u}, 1}, + {0x3ebu, {0x3eau, 0x0u, 0x0u}, 1}, + {0x3edu, {0x3ecu, 0x0u, 0x0u}, 1}, + {0x3efu, {0x3eeu, 0x0u, 0x0u}, 1}, + {0x3f0u, {0x39au, 0x0u, 0x0u}, 1}, + {0x3f1u, {0x3a1u, 0x0u, 0x0u}, 1}, + {0x3f2u, {0x3f9u, 0x0u, 0x0u}, 1}, + {0x3f3u, {0x37fu, 0x0u, 0x0u}, 1}, + {0x3f5u, {0x395u, 0x0u, 0x0u}, 1}, + {0x3f8u, {0x3f7u, 0x0u, 0x0u}, 1}, + {0x3fbu, {0x3fau, 0x0u, 0x0u}, 1}, + {0x430u, {0x410u, 0x0u, 0x0u}, 1}, + {0x431u, {0x411u, 0x0u, 0x0u}, 1}, + {0x432u, {0x412u, 0x0u, 0x0u}, 1}, + {0x433u, {0x413u, 0x0u, 0x0u}, 1}, + {0x434u, {0x414u, 0x0u, 0x0u}, 1}, + {0x435u, {0x415u, 0x0u, 0x0u}, 1}, + {0x436u, {0x416u, 0x0u, 0x0u}, 1}, + {0x437u, {0x417u, 0x0u, 0x0u}, 1}, + {0x438u, {0x418u, 0x0u, 0x0u}, 1}, + {0x439u, {0x419u, 0x0u, 0x0u}, 1}, + {0x43au, {0x41au, 0x0u, 0x0u}, 1}, + {0x43bu, {0x41bu, 0x0u, 0x0u}, 1}, + {0x43cu, {0x41cu, 0x0u, 0x0u}, 1}, + {0x43du, {0x41du, 0x0u, 0x0u}, 1}, + {0x43eu, {0x41eu, 0x0u, 0x0u}, 1}, + {0x43fu, {0x41fu, 0x0u, 0x0u}, 1}, + {0x440u, {0x420u, 0x0u, 0x0u}, 1}, + {0x441u, {0x421u, 0x0u, 0x0u}, 1}, + {0x442u, {0x422u, 0x0u, 0x0u}, 1}, + {0x443u, {0x423u, 0x0u, 0x0u}, 1}, + {0x444u, {0x424u, 0x0u, 0x0u}, 1}, + {0x445u, {0x425u, 0x0u, 0x0u}, 1}, + {0x446u, {0x426u, 0x0u, 0x0u}, 1}, + {0x447u, {0x427u, 0x0u, 0x0u}, 1}, + {0x448u, {0x428u, 0x0u, 0x0u}, 1}, + {0x449u, {0x429u, 0x0u, 0x0u}, 1}, + {0x44au, {0x42au, 0x0u, 0x0u}, 1}, + {0x44bu, {0x42bu, 0x0u, 0x0u}, 1}, + {0x44cu, {0x42cu, 0x0u, 0x0u}, 1}, + {0x44du, {0x42du, 0x0u, 0x0u}, 1}, + {0x44eu, {0x42eu, 0x0u, 0x0u}, 1}, + {0x44fu, {0x42fu, 0x0u, 0x0u}, 1}, + {0x450u, {0x400u, 0x0u, 0x0u}, 1}, + {0x451u, {0x401u, 0x0u, 0x0u}, 1}, + {0x452u, {0x402u, 0x0u, 0x0u}, 1}, + {0x453u, {0x403u, 0x0u, 0x0u}, 1}, + {0x454u, {0x404u, 0x0u, 0x0u}, 1}, + {0x455u, {0x405u, 0x0u, 0x0u}, 1}, + {0x456u, {0x406u, 0x0u, 0x0u}, 1}, + {0x457u, {0x407u, 0x0u, 0x0u}, 1}, + {0x458u, {0x408u, 0x0u, 0x0u}, 1}, + {0x459u, {0x409u, 0x0u, 0x0u}, 1}, + {0x45au, {0x40au, 0x0u, 0x0u}, 1}, + {0x45bu, {0x40bu, 0x0u, 0x0u}, 1}, + {0x45cu, {0x40cu, 0x0u, 0x0u}, 1}, + {0x45du, {0x40du, 0x0u, 0x0u}, 1}, + {0x45eu, {0x40eu, 0x0u, 0x0u}, 1}, + {0x45fu, {0x40fu, 0x0u, 0x0u}, 1}, + {0x461u, {0x460u, 0x0u, 0x0u}, 1}, + {0x463u, {0x462u, 0x0u, 0x0u}, 1}, + {0x465u, {0x464u, 0x0u, 0x0u}, 1}, + {0x467u, {0x466u, 0x0u, 0x0u}, 1}, + {0x469u, {0x468u, 0x0u, 0x0u}, 1}, + {0x46bu, {0x46au, 0x0u, 0x0u}, 1}, + {0x46du, {0x46cu, 0x0u, 0x0u}, 1}, + {0x46fu, {0x46eu, 0x0u, 0x0u}, 1}, + {0x471u, {0x470u, 0x0u, 0x0u}, 1}, + {0x473u, {0x472u, 0x0u, 0x0u}, 1}, + {0x475u, {0x474u, 0x0u, 0x0u}, 1}, + {0x477u, {0x476u, 0x0u, 0x0u}, 1}, + {0x479u, {0x478u, 0x0u, 0x0u}, 1}, + {0x47bu, {0x47au, 0x0u, 0x0u}, 1}, + {0x47du, {0x47cu, 0x0u, 0x0u}, 1}, + {0x47fu, {0x47eu, 0x0u, 0x0u}, 1}, + {0x481u, {0x480u, 0x0u, 0x0u}, 1}, + {0x48bu, {0x48au, 0x0u, 0x0u}, 1}, + {0x48du, {0x48cu, 0x0u, 0x0u}, 1}, + {0x48fu, {0x48eu, 0x0u, 0x0u}, 1}, + {0x491u, {0x490u, 0x0u, 0x0u}, 1}, + {0x493u, {0x492u, 0x0u, 0x0u}, 1}, + {0x495u, {0x494u, 0x0u, 0x0u}, 1}, + {0x497u, {0x496u, 0x0u, 0x0u}, 1}, + {0x499u, {0x498u, 0x0u, 0x0u}, 1}, + {0x49bu, {0x49au, 0x0u, 0x0u}, 1}, + {0x49du, {0x49cu, 0x0u, 0x0u}, 1}, + {0x49fu, {0x49eu, 0x0u, 0x0u}, 1}, + {0x4a1u, {0x4a0u, 0x0u, 0x0u}, 1}, + {0x4a3u, {0x4a2u, 0x0u, 0x0u}, 1}, + {0x4a5u, {0x4a4u, 0x0u, 0x0u}, 1}, + {0x4a7u, {0x4a6u, 0x0u, 0x0u}, 1}, + {0x4a9u, {0x4a8u, 0x0u, 0x0u}, 1}, + {0x4abu, {0x4aau, 0x0u, 0x0u}, 1}, + {0x4adu, {0x4acu, 0x0u, 0x0u}, 1}, + {0x4afu, {0x4aeu, 0x0u, 0x0u}, 1}, + {0x4b1u, {0x4b0u, 0x0u, 0x0u}, 1}, + {0x4b3u, {0x4b2u, 0x0u, 0x0u}, 1}, + {0x4b5u, {0x4b4u, 0x0u, 0x0u}, 1}, + {0x4b7u, {0x4b6u, 0x0u, 0x0u}, 1}, + {0x4b9u, {0x4b8u, 0x0u, 0x0u}, 1}, + {0x4bbu, {0x4bau, 0x0u, 0x0u}, 1}, + {0x4bdu, {0x4bcu, 0x0u, 0x0u}, 1}, + {0x4bfu, {0x4beu, 0x0u, 0x0u}, 1}, + {0x4c2u, {0x4c1u, 0x0u, 0x0u}, 1}, + {0x4c4u, {0x4c3u, 0x0u, 0x0u}, 1}, + {0x4c6u, {0x4c5u, 0x0u, 0x0u}, 1}, + {0x4c8u, {0x4c7u, 0x0u, 0x0u}, 1}, + {0x4cau, {0x4c9u, 0x0u, 0x0u}, 1}, + {0x4ccu, {0x4cbu, 0x0u, 0x0u}, 1}, + {0x4ceu, {0x4cdu, 0x0u, 0x0u}, 1}, + {0x4cfu, {0x4c0u, 0x0u, 0x0u}, 1}, + {0x4d1u, {0x4d0u, 0x0u, 0x0u}, 1}, + {0x4d3u, {0x4d2u, 0x0u, 0x0u}, 1}, + {0x4d5u, {0x4d4u, 0x0u, 0x0u}, 1}, + {0x4d7u, {0x4d6u, 0x0u, 0x0u}, 1}, + {0x4d9u, {0x4d8u, 0x0u, 0x0u}, 1}, + {0x4dbu, {0x4dau, 0x0u, 0x0u}, 1}, + {0x4ddu, {0x4dcu, 0x0u, 0x0u}, 1}, + {0x4dfu, {0x4deu, 0x0u, 0x0u}, 1}, + {0x4e1u, {0x4e0u, 0x0u, 0x0u}, 1}, + {0x4e3u, {0x4e2u, 0x0u, 0x0u}, 1}, + {0x4e5u, {0x4e4u, 0x0u, 0x0u}, 1}, + {0x4e7u, {0x4e6u, 0x0u, 0x0u}, 1}, + {0x4e9u, {0x4e8u, 0x0u, 0x0u}, 1}, + {0x4ebu, {0x4eau, 0x0u, 0x0u}, 1}, + {0x4edu, {0x4ecu, 0x0u, 0x0u}, 1}, + {0x4efu, {0x4eeu, 0x0u, 0x0u}, 1}, + {0x4f1u, {0x4f0u, 0x0u, 0x0u}, 1}, + {0x4f3u, {0x4f2u, 0x0u, 0x0u}, 1}, + {0x4f5u, {0x4f4u, 0x0u, 0x0u}, 1}, + {0x4f7u, {0x4f6u, 0x0u, 0x0u}, 1}, + {0x4f9u, {0x4f8u, 0x0u, 0x0u}, 1}, + {0x4fbu, {0x4fau, 0x0u, 0x0u}, 1}, + {0x4fdu, {0x4fcu, 0x0u, 0x0u}, 1}, + {0x4ffu, {0x4feu, 0x0u, 0x0u}, 1}, + {0x501u, {0x500u, 0x0u, 0x0u}, 1}, + {0x503u, {0x502u, 0x0u, 0x0u}, 1}, + {0x505u, {0x504u, 0x0u, 0x0u}, 1}, + {0x507u, {0x506u, 0x0u, 0x0u}, 1}, + {0x509u, {0x508u, 0x0u, 0x0u}, 1}, + {0x50bu, {0x50au, 0x0u, 0x0u}, 1}, + {0x50du, {0x50cu, 0x0u, 0x0u}, 1}, + {0x50fu, {0x50eu, 0x0u, 0x0u}, 1}, + {0x511u, {0x510u, 0x0u, 0x0u}, 1}, + {0x513u, {0x512u, 0x0u, 0x0u}, 1}, + {0x515u, {0x514u, 0x0u, 0x0u}, 1}, + {0x517u, {0x516u, 0x0u, 0x0u}, 1}, + {0x519u, {0x518u, 0x0u, 0x0u}, 1}, + {0x51bu, {0x51au, 0x0u, 0x0u}, 1}, + {0x51du, {0x51cu, 0x0u, 0x0u}, 1}, + {0x51fu, {0x51eu, 0x0u, 0x0u}, 1}, + {0x521u, {0x520u, 0x0u, 0x0u}, 1}, + {0x523u, {0x522u, 0x0u, 0x0u}, 1}, + {0x525u, {0x524u, 0x0u, 0x0u}, 1}, + {0x527u, {0x526u, 0x0u, 0x0u}, 1}, + {0x529u, {0x528u, 0x0u, 0x0u}, 1}, + {0x52bu, {0x52au, 0x0u, 0x0u}, 1}, + {0x52du, {0x52cu, 0x0u, 0x0u}, 1}, + {0x52fu, {0x52eu, 0x0u, 0x0u}, 1}, + {0x561u, {0x531u, 0x0u, 0x0u}, 1}, + {0x562u, {0x532u, 0x0u, 0x0u}, 1}, + {0x563u, {0x533u, 0x0u, 0x0u}, 1}, + {0x564u, {0x534u, 0x0u, 0x0u}, 1}, + {0x565u, {0x535u, 0x0u, 0x0u}, 1}, + {0x566u, {0x536u, 0x0u, 0x0u}, 1}, + {0x567u, {0x537u, 0x0u, 0x0u}, 1}, + {0x568u, {0x538u, 0x0u, 0x0u}, 1}, + {0x569u, {0x539u, 0x0u, 0x0u}, 1}, + {0x56au, {0x53au, 0x0u, 0x0u}, 1}, + {0x56bu, {0x53bu, 0x0u, 0x0u}, 1}, + {0x56cu, {0x53cu, 0x0u, 0x0u}, 1}, + {0x56du, {0x53du, 0x0u, 0x0u}, 1}, + {0x56eu, {0x53eu, 0x0u, 0x0u}, 1}, + {0x56fu, {0x53fu, 0x0u, 0x0u}, 1}, + {0x570u, {0x540u, 0x0u, 0x0u}, 1}, + {0x571u, {0x541u, 0x0u, 0x0u}, 1}, + {0x572u, {0x542u, 0x0u, 0x0u}, 1}, + {0x573u, {0x543u, 0x0u, 0x0u}, 1}, + {0x574u, {0x544u, 0x0u, 0x0u}, 1}, + {0x575u, {0x545u, 0x0u, 0x0u}, 1}, + {0x576u, {0x546u, 0x0u, 0x0u}, 1}, + {0x577u, {0x547u, 0x0u, 0x0u}, 1}, + {0x578u, {0x548u, 0x0u, 0x0u}, 1}, + {0x579u, {0x549u, 0x0u, 0x0u}, 1}, + {0x57au, {0x54au, 0x0u, 0x0u}, 1}, + {0x57bu, {0x54bu, 0x0u, 0x0u}, 1}, + {0x57cu, {0x54cu, 0x0u, 0x0u}, 1}, + {0x57du, {0x54du, 0x0u, 0x0u}, 1}, + {0x57eu, {0x54eu, 0x0u, 0x0u}, 1}, + {0x57fu, {0x54fu, 0x0u, 0x0u}, 1}, + {0x580u, {0x550u, 0x0u, 0x0u}, 1}, + {0x581u, {0x551u, 0x0u, 0x0u}, 1}, + {0x582u, {0x552u, 0x0u, 0x0u}, 1}, + {0x583u, {0x553u, 0x0u, 0x0u}, 1}, + {0x584u, {0x554u, 0x0u, 0x0u}, 1}, + {0x585u, {0x555u, 0x0u, 0x0u}, 1}, + {0x586u, {0x556u, 0x0u, 0x0u}, 1}, + {0x587u, {0x535u, 0x552u, 0x0u}, 2}, + {0x10d0u, {0x1c90u, 0x0u, 0x0u}, 1}, + {0x10d1u, {0x1c91u, 0x0u, 0x0u}, 1}, + {0x10d2u, {0x1c92u, 0x0u, 0x0u}, 1}, + {0x10d3u, {0x1c93u, 0x0u, 0x0u}, 1}, + {0x10d4u, {0x1c94u, 0x0u, 0x0u}, 1}, + {0x10d5u, {0x1c95u, 0x0u, 0x0u}, 1}, + {0x10d6u, {0x1c96u, 0x0u, 0x0u}, 1}, + {0x10d7u, {0x1c97u, 0x0u, 0x0u}, 1}, + {0x10d8u, {0x1c98u, 0x0u, 0x0u}, 1}, + {0x10d9u, {0x1c99u, 0x0u, 0x0u}, 1}, + {0x10dau, {0x1c9au, 0x0u, 0x0u}, 1}, + {0x10dbu, {0x1c9bu, 0x0u, 0x0u}, 1}, + {0x10dcu, {0x1c9cu, 0x0u, 0x0u}, 1}, + {0x10ddu, {0x1c9du, 0x0u, 0x0u}, 1}, + {0x10deu, {0x1c9eu, 0x0u, 0x0u}, 1}, + {0x10dfu, {0x1c9fu, 0x0u, 0x0u}, 1}, + {0x10e0u, {0x1ca0u, 0x0u, 0x0u}, 1}, + {0x10e1u, {0x1ca1u, 0x0u, 0x0u}, 1}, + {0x10e2u, {0x1ca2u, 0x0u, 0x0u}, 1}, + {0x10e3u, {0x1ca3u, 0x0u, 0x0u}, 1}, + {0x10e4u, {0x1ca4u, 0x0u, 0x0u}, 1}, + {0x10e5u, {0x1ca5u, 0x0u, 0x0u}, 1}, + {0x10e6u, {0x1ca6u, 0x0u, 0x0u}, 1}, + {0x10e7u, {0x1ca7u, 0x0u, 0x0u}, 1}, + {0x10e8u, {0x1ca8u, 0x0u, 0x0u}, 1}, + {0x10e9u, {0x1ca9u, 0x0u, 0x0u}, 1}, + {0x10eau, {0x1caau, 0x0u, 0x0u}, 1}, + {0x10ebu, {0x1cabu, 0x0u, 0x0u}, 1}, + {0x10ecu, {0x1cacu, 0x0u, 0x0u}, 1}, + {0x10edu, {0x1cadu, 0x0u, 0x0u}, 1}, + {0x10eeu, {0x1caeu, 0x0u, 0x0u}, 1}, + {0x10efu, {0x1cafu, 0x0u, 0x0u}, 1}, + {0x10f0u, {0x1cb0u, 0x0u, 0x0u}, 1}, + {0x10f1u, {0x1cb1u, 0x0u, 0x0u}, 1}, + {0x10f2u, {0x1cb2u, 0x0u, 0x0u}, 1}, + {0x10f3u, {0x1cb3u, 0x0u, 0x0u}, 1}, + {0x10f4u, {0x1cb4u, 0x0u, 0x0u}, 1}, + {0x10f5u, {0x1cb5u, 0x0u, 0x0u}, 1}, + {0x10f6u, {0x1cb6u, 0x0u, 0x0u}, 1}, + {0x10f7u, {0x1cb7u, 0x0u, 0x0u}, 1}, + {0x10f8u, {0x1cb8u, 0x0u, 0x0u}, 1}, + {0x10f9u, {0x1cb9u, 0x0u, 0x0u}, 1}, + {0x10fau, {0x1cbau, 0x0u, 0x0u}, 1}, + {0x10fdu, {0x1cbdu, 0x0u, 0x0u}, 1}, + {0x10feu, {0x1cbeu, 0x0u, 0x0u}, 1}, + {0x10ffu, {0x1cbfu, 0x0u, 0x0u}, 1}, + {0x13f8u, {0x13f0u, 0x0u, 0x0u}, 1}, + {0x13f9u, {0x13f1u, 0x0u, 0x0u}, 1}, + {0x13fau, {0x13f2u, 0x0u, 0x0u}, 1}, + {0x13fbu, {0x13f3u, 0x0u, 0x0u}, 1}, + {0x13fcu, {0x13f4u, 0x0u, 0x0u}, 1}, + {0x13fdu, {0x13f5u, 0x0u, 0x0u}, 1}, + {0x1c80u, {0x412u, 0x0u, 0x0u}, 1}, + {0x1c81u, {0x414u, 0x0u, 0x0u}, 1}, + {0x1c82u, {0x41eu, 0x0u, 0x0u}, 1}, + {0x1c83u, {0x421u, 0x0u, 0x0u}, 1}, + {0x1c84u, {0x422u, 0x0u, 0x0u}, 1}, + {0x1c85u, {0x422u, 0x0u, 0x0u}, 1}, + {0x1c86u, {0x42au, 0x0u, 0x0u}, 1}, + {0x1c87u, {0x462u, 0x0u, 0x0u}, 1}, + {0x1c88u, {0xa64au, 0x0u, 0x0u}, 1}, + {0x1c8au, {0x1c89u, 0x0u, 0x0u}, 1}, + {0x1d79u, {0xa77du, 0x0u, 0x0u}, 1}, + {0x1d7du, {0x2c63u, 0x0u, 0x0u}, 1}, + {0x1d8eu, {0xa7c6u, 0x0u, 0x0u}, 1}, + {0x1e01u, {0x1e00u, 0x0u, 0x0u}, 1}, + {0x1e03u, {0x1e02u, 0x0u, 0x0u}, 1}, + {0x1e05u, {0x1e04u, 0x0u, 0x0u}, 1}, + {0x1e07u, {0x1e06u, 0x0u, 0x0u}, 1}, + {0x1e09u, {0x1e08u, 0x0u, 0x0u}, 1}, + {0x1e0bu, {0x1e0au, 0x0u, 0x0u}, 1}, + {0x1e0du, {0x1e0cu, 0x0u, 0x0u}, 1}, + {0x1e0fu, {0x1e0eu, 0x0u, 0x0u}, 1}, + {0x1e11u, {0x1e10u, 0x0u, 0x0u}, 1}, + {0x1e13u, {0x1e12u, 0x0u, 0x0u}, 1}, + {0x1e15u, {0x1e14u, 0x0u, 0x0u}, 1}, + {0x1e17u, {0x1e16u, 0x0u, 0x0u}, 1}, + {0x1e19u, {0x1e18u, 0x0u, 0x0u}, 1}, + {0x1e1bu, {0x1e1au, 0x0u, 0x0u}, 1}, + {0x1e1du, {0x1e1cu, 0x0u, 0x0u}, 1}, + {0x1e1fu, {0x1e1eu, 0x0u, 0x0u}, 1}, + {0x1e21u, {0x1e20u, 0x0u, 0x0u}, 1}, + {0x1e23u, {0x1e22u, 0x0u, 0x0u}, 1}, + {0x1e25u, {0x1e24u, 0x0u, 0x0u}, 1}, + {0x1e27u, {0x1e26u, 0x0u, 0x0u}, 1}, + {0x1e29u, {0x1e28u, 0x0u, 0x0u}, 1}, + {0x1e2bu, {0x1e2au, 0x0u, 0x0u}, 1}, + {0x1e2du, {0x1e2cu, 0x0u, 0x0u}, 1}, + {0x1e2fu, {0x1e2eu, 0x0u, 0x0u}, 1}, + {0x1e31u, {0x1e30u, 0x0u, 0x0u}, 1}, + {0x1e33u, {0x1e32u, 0x0u, 0x0u}, 1}, + {0x1e35u, {0x1e34u, 0x0u, 0x0u}, 1}, + {0x1e37u, {0x1e36u, 0x0u, 0x0u}, 1}, + {0x1e39u, {0x1e38u, 0x0u, 0x0u}, 1}, + {0x1e3bu, {0x1e3au, 0x0u, 0x0u}, 1}, + {0x1e3du, {0x1e3cu, 0x0u, 0x0u}, 1}, + {0x1e3fu, {0x1e3eu, 0x0u, 0x0u}, 1}, + {0x1e41u, {0x1e40u, 0x0u, 0x0u}, 1}, + {0x1e43u, {0x1e42u, 0x0u, 0x0u}, 1}, + {0x1e45u, {0x1e44u, 0x0u, 0x0u}, 1}, + {0x1e47u, {0x1e46u, 0x0u, 0x0u}, 1}, + {0x1e49u, {0x1e48u, 0x0u, 0x0u}, 1}, + {0x1e4bu, {0x1e4au, 0x0u, 0x0u}, 1}, + {0x1e4du, {0x1e4cu, 0x0u, 0x0u}, 1}, + {0x1e4fu, {0x1e4eu, 0x0u, 0x0u}, 1}, + {0x1e51u, {0x1e50u, 0x0u, 0x0u}, 1}, + {0x1e53u, {0x1e52u, 0x0u, 0x0u}, 1}, + {0x1e55u, {0x1e54u, 0x0u, 0x0u}, 1}, + {0x1e57u, {0x1e56u, 0x0u, 0x0u}, 1}, + {0x1e59u, {0x1e58u, 0x0u, 0x0u}, 1}, + {0x1e5bu, {0x1e5au, 0x0u, 0x0u}, 1}, + {0x1e5du, {0x1e5cu, 0x0u, 0x0u}, 1}, + {0x1e5fu, {0x1e5eu, 0x0u, 0x0u}, 1}, + {0x1e61u, {0x1e60u, 0x0u, 0x0u}, 1}, + {0x1e63u, {0x1e62u, 0x0u, 0x0u}, 1}, + {0x1e65u, {0x1e64u, 0x0u, 0x0u}, 1}, + {0x1e67u, {0x1e66u, 0x0u, 0x0u}, 1}, + {0x1e69u, {0x1e68u, 0x0u, 0x0u}, 1}, + {0x1e6bu, {0x1e6au, 0x0u, 0x0u}, 1}, + {0x1e6du, {0x1e6cu, 0x0u, 0x0u}, 1}, + {0x1e6fu, {0x1e6eu, 0x0u, 0x0u}, 1}, + {0x1e71u, {0x1e70u, 0x0u, 0x0u}, 1}, + {0x1e73u, {0x1e72u, 0x0u, 0x0u}, 1}, + {0x1e75u, {0x1e74u, 0x0u, 0x0u}, 1}, + {0x1e77u, {0x1e76u, 0x0u, 0x0u}, 1}, + {0x1e79u, {0x1e78u, 0x0u, 0x0u}, 1}, + {0x1e7bu, {0x1e7au, 0x0u, 0x0u}, 1}, + {0x1e7du, {0x1e7cu, 0x0u, 0x0u}, 1}, + {0x1e7fu, {0x1e7eu, 0x0u, 0x0u}, 1}, + {0x1e81u, {0x1e80u, 0x0u, 0x0u}, 1}, + {0x1e83u, {0x1e82u, 0x0u, 0x0u}, 1}, + {0x1e85u, {0x1e84u, 0x0u, 0x0u}, 1}, + {0x1e87u, {0x1e86u, 0x0u, 0x0u}, 1}, + {0x1e89u, {0x1e88u, 0x0u, 0x0u}, 1}, + {0x1e8bu, {0x1e8au, 0x0u, 0x0u}, 1}, + {0x1e8du, {0x1e8cu, 0x0u, 0x0u}, 1}, + {0x1e8fu, {0x1e8eu, 0x0u, 0x0u}, 1}, + {0x1e91u, {0x1e90u, 0x0u, 0x0u}, 1}, + {0x1e93u, {0x1e92u, 0x0u, 0x0u}, 1}, + {0x1e95u, {0x1e94u, 0x0u, 0x0u}, 1}, + {0x1e96u, {0x48u, 0x331u, 0x0u}, 2}, + {0x1e97u, {0x54u, 0x308u, 0x0u}, 2}, + {0x1e98u, {0x57u, 0x30au, 0x0u}, 2}, + {0x1e99u, {0x59u, 0x30au, 0x0u}, 2}, + {0x1e9au, {0x41u, 0x2beu, 0x0u}, 2}, + {0x1e9bu, {0x1e60u, 0x0u, 0x0u}, 1}, + {0x1ea1u, {0x1ea0u, 0x0u, 0x0u}, 1}, + {0x1ea3u, {0x1ea2u, 0x0u, 0x0u}, 1}, + {0x1ea5u, {0x1ea4u, 0x0u, 0x0u}, 1}, + {0x1ea7u, {0x1ea6u, 0x0u, 0x0u}, 1}, + {0x1ea9u, {0x1ea8u, 0x0u, 0x0u}, 1}, + {0x1eabu, {0x1eaau, 0x0u, 0x0u}, 1}, + {0x1eadu, {0x1eacu, 0x0u, 0x0u}, 1}, + {0x1eafu, {0x1eaeu, 0x0u, 0x0u}, 1}, + {0x1eb1u, {0x1eb0u, 0x0u, 0x0u}, 1}, + {0x1eb3u, {0x1eb2u, 0x0u, 0x0u}, 1}, + {0x1eb5u, {0x1eb4u, 0x0u, 0x0u}, 1}, + {0x1eb7u, {0x1eb6u, 0x0u, 0x0u}, 1}, + {0x1eb9u, {0x1eb8u, 0x0u, 0x0u}, 1}, + {0x1ebbu, {0x1ebau, 0x0u, 0x0u}, 1}, + {0x1ebdu, {0x1ebcu, 0x0u, 0x0u}, 1}, + {0x1ebfu, {0x1ebeu, 0x0u, 0x0u}, 1}, + {0x1ec1u, {0x1ec0u, 0x0u, 0x0u}, 1}, + {0x1ec3u, {0x1ec2u, 0x0u, 0x0u}, 1}, + {0x1ec5u, {0x1ec4u, 0x0u, 0x0u}, 1}, + {0x1ec7u, {0x1ec6u, 0x0u, 0x0u}, 1}, + {0x1ec9u, {0x1ec8u, 0x0u, 0x0u}, 1}, + {0x1ecbu, {0x1ecau, 0x0u, 0x0u}, 1}, + {0x1ecdu, {0x1eccu, 0x0u, 0x0u}, 1}, + {0x1ecfu, {0x1eceu, 0x0u, 0x0u}, 1}, + {0x1ed1u, {0x1ed0u, 0x0u, 0x0u}, 1}, + {0x1ed3u, {0x1ed2u, 0x0u, 0x0u}, 1}, + {0x1ed5u, {0x1ed4u, 0x0u, 0x0u}, 1}, + {0x1ed7u, {0x1ed6u, 0x0u, 0x0u}, 1}, + {0x1ed9u, {0x1ed8u, 0x0u, 0x0u}, 1}, + {0x1edbu, {0x1edau, 0x0u, 0x0u}, 1}, + {0x1eddu, {0x1edcu, 0x0u, 0x0u}, 1}, + {0x1edfu, {0x1edeu, 0x0u, 0x0u}, 1}, + {0x1ee1u, {0x1ee0u, 0x0u, 0x0u}, 1}, + {0x1ee3u, {0x1ee2u, 0x0u, 0x0u}, 1}, + {0x1ee5u, {0x1ee4u, 0x0u, 0x0u}, 1}, + {0x1ee7u, {0x1ee6u, 0x0u, 0x0u}, 1}, + {0x1ee9u, {0x1ee8u, 0x0u, 0x0u}, 1}, + {0x1eebu, {0x1eeau, 0x0u, 0x0u}, 1}, + {0x1eedu, {0x1eecu, 0x0u, 0x0u}, 1}, + {0x1eefu, {0x1eeeu, 0x0u, 0x0u}, 1}, + {0x1ef1u, {0x1ef0u, 0x0u, 0x0u}, 1}, + {0x1ef3u, {0x1ef2u, 0x0u, 0x0u}, 1}, + {0x1ef5u, {0x1ef4u, 0x0u, 0x0u}, 1}, + {0x1ef7u, {0x1ef6u, 0x0u, 0x0u}, 1}, + {0x1ef9u, {0x1ef8u, 0x0u, 0x0u}, 1}, + {0x1efbu, {0x1efau, 0x0u, 0x0u}, 1}, + {0x1efdu, {0x1efcu, 0x0u, 0x0u}, 1}, + {0x1effu, {0x1efeu, 0x0u, 0x0u}, 1}, + {0x1f00u, {0x1f08u, 0x0u, 0x0u}, 1}, + {0x1f01u, {0x1f09u, 0x0u, 0x0u}, 1}, + {0x1f02u, {0x1f0au, 0x0u, 0x0u}, 1}, + {0x1f03u, {0x1f0bu, 0x0u, 0x0u}, 1}, + {0x1f04u, {0x1f0cu, 0x0u, 0x0u}, 1}, + {0x1f05u, {0x1f0du, 0x0u, 0x0u}, 1}, + {0x1f06u, {0x1f0eu, 0x0u, 0x0u}, 1}, + {0x1f07u, {0x1f0fu, 0x0u, 0x0u}, 1}, + {0x1f10u, {0x1f18u, 0x0u, 0x0u}, 1}, + {0x1f11u, {0x1f19u, 0x0u, 0x0u}, 1}, + {0x1f12u, {0x1f1au, 0x0u, 0x0u}, 1}, + {0x1f13u, {0x1f1bu, 0x0u, 0x0u}, 1}, + {0x1f14u, {0x1f1cu, 0x0u, 0x0u}, 1}, + {0x1f15u, {0x1f1du, 0x0u, 0x0u}, 1}, + {0x1f20u, {0x1f28u, 0x0u, 0x0u}, 1}, + {0x1f21u, {0x1f29u, 0x0u, 0x0u}, 1}, + {0x1f22u, {0x1f2au, 0x0u, 0x0u}, 1}, + {0x1f23u, {0x1f2bu, 0x0u, 0x0u}, 1}, + {0x1f24u, {0x1f2cu, 0x0u, 0x0u}, 1}, + {0x1f25u, {0x1f2du, 0x0u, 0x0u}, 1}, + {0x1f26u, {0x1f2eu, 0x0u, 0x0u}, 1}, + {0x1f27u, {0x1f2fu, 0x0u, 0x0u}, 1}, + {0x1f30u, {0x1f38u, 0x0u, 0x0u}, 1}, + {0x1f31u, {0x1f39u, 0x0u, 0x0u}, 1}, + {0x1f32u, {0x1f3au, 0x0u, 0x0u}, 1}, + {0x1f33u, {0x1f3bu, 0x0u, 0x0u}, 1}, + {0x1f34u, {0x1f3cu, 0x0u, 0x0u}, 1}, + {0x1f35u, {0x1f3du, 0x0u, 0x0u}, 1}, + {0x1f36u, {0x1f3eu, 0x0u, 0x0u}, 1}, + {0x1f37u, {0x1f3fu, 0x0u, 0x0u}, 1}, + {0x1f40u, {0x1f48u, 0x0u, 0x0u}, 1}, + {0x1f41u, {0x1f49u, 0x0u, 0x0u}, 1}, + {0x1f42u, {0x1f4au, 0x0u, 0x0u}, 1}, + {0x1f43u, {0x1f4bu, 0x0u, 0x0u}, 1}, + {0x1f44u, {0x1f4cu, 0x0u, 0x0u}, 1}, + {0x1f45u, {0x1f4du, 0x0u, 0x0u}, 1}, + {0x1f50u, {0x3a5u, 0x313u, 0x0u}, 2}, + {0x1f51u, {0x1f59u, 0x0u, 0x0u}, 1}, + {0x1f52u, {0x3a5u, 0x313u, 0x300u}, 3}, + {0x1f53u, {0x1f5bu, 0x0u, 0x0u}, 1}, + {0x1f54u, {0x3a5u, 0x313u, 0x301u}, 3}, + {0x1f55u, {0x1f5du, 0x0u, 0x0u}, 1}, + {0x1f56u, {0x3a5u, 0x313u, 0x342u}, 3}, + {0x1f57u, {0x1f5fu, 0x0u, 0x0u}, 1}, + {0x1f60u, {0x1f68u, 0x0u, 0x0u}, 1}, + {0x1f61u, {0x1f69u, 0x0u, 0x0u}, 1}, + {0x1f62u, {0x1f6au, 0x0u, 0x0u}, 1}, + {0x1f63u, {0x1f6bu, 0x0u, 0x0u}, 1}, + {0x1f64u, {0x1f6cu, 0x0u, 0x0u}, 1}, + {0x1f65u, {0x1f6du, 0x0u, 0x0u}, 1}, + {0x1f66u, {0x1f6eu, 0x0u, 0x0u}, 1}, + {0x1f67u, {0x1f6fu, 0x0u, 0x0u}, 1}, + {0x1f70u, {0x1fbau, 0x0u, 0x0u}, 1}, + {0x1f71u, {0x1fbbu, 0x0u, 0x0u}, 1}, + {0x1f72u, {0x1fc8u, 0x0u, 0x0u}, 1}, + {0x1f73u, {0x1fc9u, 0x0u, 0x0u}, 1}, + {0x1f74u, {0x1fcau, 0x0u, 0x0u}, 1}, + {0x1f75u, {0x1fcbu, 0x0u, 0x0u}, 1}, + {0x1f76u, {0x1fdau, 0x0u, 0x0u}, 1}, + {0x1f77u, {0x1fdbu, 0x0u, 0x0u}, 1}, + {0x1f78u, {0x1ff8u, 0x0u, 0x0u}, 1}, + {0x1f79u, {0x1ff9u, 0x0u, 0x0u}, 1}, + {0x1f7au, {0x1feau, 0x0u, 0x0u}, 1}, + {0x1f7bu, {0x1febu, 0x0u, 0x0u}, 1}, + {0x1f7cu, {0x1ffau, 0x0u, 0x0u}, 1}, + {0x1f7du, {0x1ffbu, 0x0u, 0x0u}, 1}, + {0x1f80u, {0x1f08u, 0x399u, 0x0u}, 2}, + {0x1f81u, {0x1f09u, 0x399u, 0x0u}, 2}, + {0x1f82u, {0x1f0au, 0x399u, 0x0u}, 2}, + {0x1f83u, {0x1f0bu, 0x399u, 0x0u}, 2}, + {0x1f84u, {0x1f0cu, 0x399u, 0x0u}, 2}, + {0x1f85u, {0x1f0du, 0x399u, 0x0u}, 2}, + {0x1f86u, {0x1f0eu, 0x399u, 0x0u}, 2}, + {0x1f87u, {0x1f0fu, 0x399u, 0x0u}, 2}, + {0x1f88u, {0x1f08u, 0x399u, 0x0u}, 2}, + {0x1f89u, {0x1f09u, 0x399u, 0x0u}, 2}, + {0x1f8au, {0x1f0au, 0x399u, 0x0u}, 2}, + {0x1f8bu, {0x1f0bu, 0x399u, 0x0u}, 2}, + {0x1f8cu, {0x1f0cu, 0x399u, 0x0u}, 2}, + {0x1f8du, {0x1f0du, 0x399u, 0x0u}, 2}, + {0x1f8eu, {0x1f0eu, 0x399u, 0x0u}, 2}, + {0x1f8fu, {0x1f0fu, 0x399u, 0x0u}, 2}, + {0x1f90u, {0x1f28u, 0x399u, 0x0u}, 2}, + {0x1f91u, {0x1f29u, 0x399u, 0x0u}, 2}, + {0x1f92u, {0x1f2au, 0x399u, 0x0u}, 2}, + {0x1f93u, {0x1f2bu, 0x399u, 0x0u}, 2}, + {0x1f94u, {0x1f2cu, 0x399u, 0x0u}, 2}, + {0x1f95u, {0x1f2du, 0x399u, 0x0u}, 2}, + {0x1f96u, {0x1f2eu, 0x399u, 0x0u}, 2}, + {0x1f97u, {0x1f2fu, 0x399u, 0x0u}, 2}, + {0x1f98u, {0x1f28u, 0x399u, 0x0u}, 2}, + {0x1f99u, {0x1f29u, 0x399u, 0x0u}, 2}, + {0x1f9au, {0x1f2au, 0x399u, 0x0u}, 2}, + {0x1f9bu, {0x1f2bu, 0x399u, 0x0u}, 2}, + {0x1f9cu, {0x1f2cu, 0x399u, 0x0u}, 2}, + {0x1f9du, {0x1f2du, 0x399u, 0x0u}, 2}, + {0x1f9eu, {0x1f2eu, 0x399u, 0x0u}, 2}, + {0x1f9fu, {0x1f2fu, 0x399u, 0x0u}, 2}, + {0x1fa0u, {0x1f68u, 0x399u, 0x0u}, 2}, + {0x1fa1u, {0x1f69u, 0x399u, 0x0u}, 2}, + {0x1fa2u, {0x1f6au, 0x399u, 0x0u}, 2}, + {0x1fa3u, {0x1f6bu, 0x399u, 0x0u}, 2}, + {0x1fa4u, {0x1f6cu, 0x399u, 0x0u}, 2}, + {0x1fa5u, {0x1f6du, 0x399u, 0x0u}, 2}, + {0x1fa6u, {0x1f6eu, 0x399u, 0x0u}, 2}, + {0x1fa7u, {0x1f6fu, 0x399u, 0x0u}, 2}, + {0x1fa8u, {0x1f68u, 0x399u, 0x0u}, 2}, + {0x1fa9u, {0x1f69u, 0x399u, 0x0u}, 2}, + {0x1faau, {0x1f6au, 0x399u, 0x0u}, 2}, + {0x1fabu, {0x1f6bu, 0x399u, 0x0u}, 2}, + {0x1facu, {0x1f6cu, 0x399u, 0x0u}, 2}, + {0x1fadu, {0x1f6du, 0x399u, 0x0u}, 2}, + {0x1faeu, {0x1f6eu, 0x399u, 0x0u}, 2}, + {0x1fafu, {0x1f6fu, 0x399u, 0x0u}, 2}, + {0x1fb0u, {0x1fb8u, 0x0u, 0x0u}, 1}, + {0x1fb1u, {0x1fb9u, 0x0u, 0x0u}, 1}, + {0x1fb2u, {0x1fbau, 0x399u, 0x0u}, 2}, + {0x1fb3u, {0x391u, 0x399u, 0x0u}, 2}, + {0x1fb4u, {0x386u, 0x399u, 0x0u}, 2}, + {0x1fb6u, {0x391u, 0x342u, 0x0u}, 2}, + {0x1fb7u, {0x391u, 0x342u, 0x399u}, 3}, + {0x1fbcu, {0x391u, 0x399u, 0x0u}, 2}, + {0x1fbeu, {0x399u, 0x0u, 0x0u}, 1}, + {0x1fc2u, {0x1fcau, 0x399u, 0x0u}, 2}, + {0x1fc3u, {0x397u, 0x399u, 0x0u}, 2}, + {0x1fc4u, {0x389u, 0x399u, 0x0u}, 2}, + {0x1fc6u, {0x397u, 0x342u, 0x0u}, 2}, + {0x1fc7u, {0x397u, 0x342u, 0x399u}, 3}, + {0x1fccu, {0x397u, 0x399u, 0x0u}, 2}, + {0x1fd0u, {0x1fd8u, 0x0u, 0x0u}, 1}, + {0x1fd1u, {0x1fd9u, 0x0u, 0x0u}, 1}, + {0x1fd2u, {0x399u, 0x308u, 0x300u}, 3}, + {0x1fd3u, {0x399u, 0x308u, 0x301u}, 3}, + {0x1fd6u, {0x399u, 0x342u, 0x0u}, 2}, + {0x1fd7u, {0x399u, 0x308u, 0x342u}, 3}, + {0x1fe0u, {0x1fe8u, 0x0u, 0x0u}, 1}, + {0x1fe1u, {0x1fe9u, 0x0u, 0x0u}, 1}, + {0x1fe2u, {0x3a5u, 0x308u, 0x300u}, 3}, + {0x1fe3u, {0x3a5u, 0x308u, 0x301u}, 3}, + {0x1fe4u, {0x3a1u, 0x313u, 0x0u}, 2}, + {0x1fe5u, {0x1fecu, 0x0u, 0x0u}, 1}, + {0x1fe6u, {0x3a5u, 0x342u, 0x0u}, 2}, + {0x1fe7u, {0x3a5u, 0x308u, 0x342u}, 3}, + {0x1ff2u, {0x1ffau, 0x399u, 0x0u}, 2}, + {0x1ff3u, {0x3a9u, 0x399u, 0x0u}, 2}, + {0x1ff4u, {0x38fu, 0x399u, 0x0u}, 2}, + {0x1ff6u, {0x3a9u, 0x342u, 0x0u}, 2}, + {0x1ff7u, {0x3a9u, 0x342u, 0x399u}, 3}, + {0x1ffcu, {0x3a9u, 0x399u, 0x0u}, 2}, + {0x214eu, {0x2132u, 0x0u, 0x0u}, 1}, + {0x2170u, {0x2160u, 0x0u, 0x0u}, 1}, + {0x2171u, {0x2161u, 0x0u, 0x0u}, 1}, + {0x2172u, {0x2162u, 0x0u, 0x0u}, 1}, + {0x2173u, {0x2163u, 0x0u, 0x0u}, 1}, + {0x2174u, {0x2164u, 0x0u, 0x0u}, 1}, + {0x2175u, {0x2165u, 0x0u, 0x0u}, 1}, + {0x2176u, {0x2166u, 0x0u, 0x0u}, 1}, + {0x2177u, {0x2167u, 0x0u, 0x0u}, 1}, + {0x2178u, {0x2168u, 0x0u, 0x0u}, 1}, + {0x2179u, {0x2169u, 0x0u, 0x0u}, 1}, + {0x217au, {0x216au, 0x0u, 0x0u}, 1}, + {0x217bu, {0x216bu, 0x0u, 0x0u}, 1}, + {0x217cu, {0x216cu, 0x0u, 0x0u}, 1}, + {0x217du, {0x216du, 0x0u, 0x0u}, 1}, + {0x217eu, {0x216eu, 0x0u, 0x0u}, 1}, + {0x217fu, {0x216fu, 0x0u, 0x0u}, 1}, + {0x2184u, {0x2183u, 0x0u, 0x0u}, 1}, + {0x24d0u, {0x24b6u, 0x0u, 0x0u}, 1}, + {0x24d1u, {0x24b7u, 0x0u, 0x0u}, 1}, + {0x24d2u, {0x24b8u, 0x0u, 0x0u}, 1}, + {0x24d3u, {0x24b9u, 0x0u, 0x0u}, 1}, + {0x24d4u, {0x24bau, 0x0u, 0x0u}, 1}, + {0x24d5u, {0x24bbu, 0x0u, 0x0u}, 1}, + {0x24d6u, {0x24bcu, 0x0u, 0x0u}, 1}, + {0x24d7u, {0x24bdu, 0x0u, 0x0u}, 1}, + {0x24d8u, {0x24beu, 0x0u, 0x0u}, 1}, + {0x24d9u, {0x24bfu, 0x0u, 0x0u}, 1}, + {0x24dau, {0x24c0u, 0x0u, 0x0u}, 1}, + {0x24dbu, {0x24c1u, 0x0u, 0x0u}, 1}, + {0x24dcu, {0x24c2u, 0x0u, 0x0u}, 1}, + {0x24ddu, {0x24c3u, 0x0u, 0x0u}, 1}, + {0x24deu, {0x24c4u, 0x0u, 0x0u}, 1}, + {0x24dfu, {0x24c5u, 0x0u, 0x0u}, 1}, + {0x24e0u, {0x24c6u, 0x0u, 0x0u}, 1}, + {0x24e1u, {0x24c7u, 0x0u, 0x0u}, 1}, + {0x24e2u, {0x24c8u, 0x0u, 0x0u}, 1}, + {0x24e3u, {0x24c9u, 0x0u, 0x0u}, 1}, + {0x24e4u, {0x24cau, 0x0u, 0x0u}, 1}, + {0x24e5u, {0x24cbu, 0x0u, 0x0u}, 1}, + {0x24e6u, {0x24ccu, 0x0u, 0x0u}, 1}, + {0x24e7u, {0x24cdu, 0x0u, 0x0u}, 1}, + {0x24e8u, {0x24ceu, 0x0u, 0x0u}, 1}, + {0x24e9u, {0x24cfu, 0x0u, 0x0u}, 1}, + {0x2c30u, {0x2c00u, 0x0u, 0x0u}, 1}, + {0x2c31u, {0x2c01u, 0x0u, 0x0u}, 1}, + {0x2c32u, {0x2c02u, 0x0u, 0x0u}, 1}, + {0x2c33u, {0x2c03u, 0x0u, 0x0u}, 1}, + {0x2c34u, {0x2c04u, 0x0u, 0x0u}, 1}, + {0x2c35u, {0x2c05u, 0x0u, 0x0u}, 1}, + {0x2c36u, {0x2c06u, 0x0u, 0x0u}, 1}, + {0x2c37u, {0x2c07u, 0x0u, 0x0u}, 1}, + {0x2c38u, {0x2c08u, 0x0u, 0x0u}, 1}, + {0x2c39u, {0x2c09u, 0x0u, 0x0u}, 1}, + {0x2c3au, {0x2c0au, 0x0u, 0x0u}, 1}, + {0x2c3bu, {0x2c0bu, 0x0u, 0x0u}, 1}, + {0x2c3cu, {0x2c0cu, 0x0u, 0x0u}, 1}, + {0x2c3du, {0x2c0du, 0x0u, 0x0u}, 1}, + {0x2c3eu, {0x2c0eu, 0x0u, 0x0u}, 1}, + {0x2c3fu, {0x2c0fu, 0x0u, 0x0u}, 1}, + {0x2c40u, {0x2c10u, 0x0u, 0x0u}, 1}, + {0x2c41u, {0x2c11u, 0x0u, 0x0u}, 1}, + {0x2c42u, {0x2c12u, 0x0u, 0x0u}, 1}, + {0x2c43u, {0x2c13u, 0x0u, 0x0u}, 1}, + {0x2c44u, {0x2c14u, 0x0u, 0x0u}, 1}, + {0x2c45u, {0x2c15u, 0x0u, 0x0u}, 1}, + {0x2c46u, {0x2c16u, 0x0u, 0x0u}, 1}, + {0x2c47u, {0x2c17u, 0x0u, 0x0u}, 1}, + {0x2c48u, {0x2c18u, 0x0u, 0x0u}, 1}, + {0x2c49u, {0x2c19u, 0x0u, 0x0u}, 1}, + {0x2c4au, {0x2c1au, 0x0u, 0x0u}, 1}, + {0x2c4bu, {0x2c1bu, 0x0u, 0x0u}, 1}, + {0x2c4cu, {0x2c1cu, 0x0u, 0x0u}, 1}, + {0x2c4du, {0x2c1du, 0x0u, 0x0u}, 1}, + {0x2c4eu, {0x2c1eu, 0x0u, 0x0u}, 1}, + {0x2c4fu, {0x2c1fu, 0x0u, 0x0u}, 1}, + {0x2c50u, {0x2c20u, 0x0u, 0x0u}, 1}, + {0x2c51u, {0x2c21u, 0x0u, 0x0u}, 1}, + {0x2c52u, {0x2c22u, 0x0u, 0x0u}, 1}, + {0x2c53u, {0x2c23u, 0x0u, 0x0u}, 1}, + {0x2c54u, {0x2c24u, 0x0u, 0x0u}, 1}, + {0x2c55u, {0x2c25u, 0x0u, 0x0u}, 1}, + {0x2c56u, {0x2c26u, 0x0u, 0x0u}, 1}, + {0x2c57u, {0x2c27u, 0x0u, 0x0u}, 1}, + {0x2c58u, {0x2c28u, 0x0u, 0x0u}, 1}, + {0x2c59u, {0x2c29u, 0x0u, 0x0u}, 1}, + {0x2c5au, {0x2c2au, 0x0u, 0x0u}, 1}, + {0x2c5bu, {0x2c2bu, 0x0u, 0x0u}, 1}, + {0x2c5cu, {0x2c2cu, 0x0u, 0x0u}, 1}, + {0x2c5du, {0x2c2du, 0x0u, 0x0u}, 1}, + {0x2c5eu, {0x2c2eu, 0x0u, 0x0u}, 1}, + {0x2c5fu, {0x2c2fu, 0x0u, 0x0u}, 1}, + {0x2c61u, {0x2c60u, 0x0u, 0x0u}, 1}, + {0x2c65u, {0x23au, 0x0u, 0x0u}, 1}, + {0x2c66u, {0x23eu, 0x0u, 0x0u}, 1}, + {0x2c68u, {0x2c67u, 0x0u, 0x0u}, 1}, + {0x2c6au, {0x2c69u, 0x0u, 0x0u}, 1}, + {0x2c6cu, {0x2c6bu, 0x0u, 0x0u}, 1}, + {0x2c73u, {0x2c72u, 0x0u, 0x0u}, 1}, + {0x2c76u, {0x2c75u, 0x0u, 0x0u}, 1}, + {0x2c81u, {0x2c80u, 0x0u, 0x0u}, 1}, + {0x2c83u, {0x2c82u, 0x0u, 0x0u}, 1}, + {0x2c85u, {0x2c84u, 0x0u, 0x0u}, 1}, + {0x2c87u, {0x2c86u, 0x0u, 0x0u}, 1}, + {0x2c89u, {0x2c88u, 0x0u, 0x0u}, 1}, + {0x2c8bu, {0x2c8au, 0x0u, 0x0u}, 1}, + {0x2c8du, {0x2c8cu, 0x0u, 0x0u}, 1}, + {0x2c8fu, {0x2c8eu, 0x0u, 0x0u}, 1}, + {0x2c91u, {0x2c90u, 0x0u, 0x0u}, 1}, + {0x2c93u, {0x2c92u, 0x0u, 0x0u}, 1}, + {0x2c95u, {0x2c94u, 0x0u, 0x0u}, 1}, + {0x2c97u, {0x2c96u, 0x0u, 0x0u}, 1}, + {0x2c99u, {0x2c98u, 0x0u, 0x0u}, 1}, + {0x2c9bu, {0x2c9au, 0x0u, 0x0u}, 1}, + {0x2c9du, {0x2c9cu, 0x0u, 0x0u}, 1}, + {0x2c9fu, {0x2c9eu, 0x0u, 0x0u}, 1}, + {0x2ca1u, {0x2ca0u, 0x0u, 0x0u}, 1}, + {0x2ca3u, {0x2ca2u, 0x0u, 0x0u}, 1}, + {0x2ca5u, {0x2ca4u, 0x0u, 0x0u}, 1}, + {0x2ca7u, {0x2ca6u, 0x0u, 0x0u}, 1}, + {0x2ca9u, {0x2ca8u, 0x0u, 0x0u}, 1}, + {0x2cabu, {0x2caau, 0x0u, 0x0u}, 1}, + {0x2cadu, {0x2cacu, 0x0u, 0x0u}, 1}, + {0x2cafu, {0x2caeu, 0x0u, 0x0u}, 1}, + {0x2cb1u, {0x2cb0u, 0x0u, 0x0u}, 1}, + {0x2cb3u, {0x2cb2u, 0x0u, 0x0u}, 1}, + {0x2cb5u, {0x2cb4u, 0x0u, 0x0u}, 1}, + {0x2cb7u, {0x2cb6u, 0x0u, 0x0u}, 1}, + {0x2cb9u, {0x2cb8u, 0x0u, 0x0u}, 1}, + {0x2cbbu, {0x2cbau, 0x0u, 0x0u}, 1}, + {0x2cbdu, {0x2cbcu, 0x0u, 0x0u}, 1}, + {0x2cbfu, {0x2cbeu, 0x0u, 0x0u}, 1}, + {0x2cc1u, {0x2cc0u, 0x0u, 0x0u}, 1}, + {0x2cc3u, {0x2cc2u, 0x0u, 0x0u}, 1}, + {0x2cc5u, {0x2cc4u, 0x0u, 0x0u}, 1}, + {0x2cc7u, {0x2cc6u, 0x0u, 0x0u}, 1}, + {0x2cc9u, {0x2cc8u, 0x0u, 0x0u}, 1}, + {0x2ccbu, {0x2ccau, 0x0u, 0x0u}, 1}, + {0x2ccdu, {0x2cccu, 0x0u, 0x0u}, 1}, + {0x2ccfu, {0x2cceu, 0x0u, 0x0u}, 1}, + {0x2cd1u, {0x2cd0u, 0x0u, 0x0u}, 1}, + {0x2cd3u, {0x2cd2u, 0x0u, 0x0u}, 1}, + {0x2cd5u, {0x2cd4u, 0x0u, 0x0u}, 1}, + {0x2cd7u, {0x2cd6u, 0x0u, 0x0u}, 1}, + {0x2cd9u, {0x2cd8u, 0x0u, 0x0u}, 1}, + {0x2cdbu, {0x2cdau, 0x0u, 0x0u}, 1}, + {0x2cddu, {0x2cdcu, 0x0u, 0x0u}, 1}, + {0x2cdfu, {0x2cdeu, 0x0u, 0x0u}, 1}, + {0x2ce1u, {0x2ce0u, 0x0u, 0x0u}, 1}, + {0x2ce3u, {0x2ce2u, 0x0u, 0x0u}, 1}, + {0x2cecu, {0x2cebu, 0x0u, 0x0u}, 1}, + {0x2ceeu, {0x2cedu, 0x0u, 0x0u}, 1}, + {0x2cf3u, {0x2cf2u, 0x0u, 0x0u}, 1}, + {0x2d00u, {0x10a0u, 0x0u, 0x0u}, 1}, + {0x2d01u, {0x10a1u, 0x0u, 0x0u}, 1}, + {0x2d02u, {0x10a2u, 0x0u, 0x0u}, 1}, + {0x2d03u, {0x10a3u, 0x0u, 0x0u}, 1}, + {0x2d04u, {0x10a4u, 0x0u, 0x0u}, 1}, + {0x2d05u, {0x10a5u, 0x0u, 0x0u}, 1}, + {0x2d06u, {0x10a6u, 0x0u, 0x0u}, 1}, + {0x2d07u, {0x10a7u, 0x0u, 0x0u}, 1}, + {0x2d08u, {0x10a8u, 0x0u, 0x0u}, 1}, + {0x2d09u, {0x10a9u, 0x0u, 0x0u}, 1}, + {0x2d0au, {0x10aau, 0x0u, 0x0u}, 1}, + {0x2d0bu, {0x10abu, 0x0u, 0x0u}, 1}, + {0x2d0cu, {0x10acu, 0x0u, 0x0u}, 1}, + {0x2d0du, {0x10adu, 0x0u, 0x0u}, 1}, + {0x2d0eu, {0x10aeu, 0x0u, 0x0u}, 1}, + {0x2d0fu, {0x10afu, 0x0u, 0x0u}, 1}, + {0x2d10u, {0x10b0u, 0x0u, 0x0u}, 1}, + {0x2d11u, {0x10b1u, 0x0u, 0x0u}, 1}, + {0x2d12u, {0x10b2u, 0x0u, 0x0u}, 1}, + {0x2d13u, {0x10b3u, 0x0u, 0x0u}, 1}, + {0x2d14u, {0x10b4u, 0x0u, 0x0u}, 1}, + {0x2d15u, {0x10b5u, 0x0u, 0x0u}, 1}, + {0x2d16u, {0x10b6u, 0x0u, 0x0u}, 1}, + {0x2d17u, {0x10b7u, 0x0u, 0x0u}, 1}, + {0x2d18u, {0x10b8u, 0x0u, 0x0u}, 1}, + {0x2d19u, {0x10b9u, 0x0u, 0x0u}, 1}, + {0x2d1au, {0x10bau, 0x0u, 0x0u}, 1}, + {0x2d1bu, {0x10bbu, 0x0u, 0x0u}, 1}, + {0x2d1cu, {0x10bcu, 0x0u, 0x0u}, 1}, + {0x2d1du, {0x10bdu, 0x0u, 0x0u}, 1}, + {0x2d1eu, {0x10beu, 0x0u, 0x0u}, 1}, + {0x2d1fu, {0x10bfu, 0x0u, 0x0u}, 1}, + {0x2d20u, {0x10c0u, 0x0u, 0x0u}, 1}, + {0x2d21u, {0x10c1u, 0x0u, 0x0u}, 1}, + {0x2d22u, {0x10c2u, 0x0u, 0x0u}, 1}, + {0x2d23u, {0x10c3u, 0x0u, 0x0u}, 1}, + {0x2d24u, {0x10c4u, 0x0u, 0x0u}, 1}, + {0x2d25u, {0x10c5u, 0x0u, 0x0u}, 1}, + {0x2d27u, {0x10c7u, 0x0u, 0x0u}, 1}, + {0x2d2du, {0x10cdu, 0x0u, 0x0u}, 1}, + {0xa641u, {0xa640u, 0x0u, 0x0u}, 1}, + {0xa643u, {0xa642u, 0x0u, 0x0u}, 1}, + {0xa645u, {0xa644u, 0x0u, 0x0u}, 1}, + {0xa647u, {0xa646u, 0x0u, 0x0u}, 1}, + {0xa649u, {0xa648u, 0x0u, 0x0u}, 1}, + {0xa64bu, {0xa64au, 0x0u, 0x0u}, 1}, + {0xa64du, {0xa64cu, 0x0u, 0x0u}, 1}, + {0xa64fu, {0xa64eu, 0x0u, 0x0u}, 1}, + {0xa651u, {0xa650u, 0x0u, 0x0u}, 1}, + {0xa653u, {0xa652u, 0x0u, 0x0u}, 1}, + {0xa655u, {0xa654u, 0x0u, 0x0u}, 1}, + {0xa657u, {0xa656u, 0x0u, 0x0u}, 1}, + {0xa659u, {0xa658u, 0x0u, 0x0u}, 1}, + {0xa65bu, {0xa65au, 0x0u, 0x0u}, 1}, + {0xa65du, {0xa65cu, 0x0u, 0x0u}, 1}, + {0xa65fu, {0xa65eu, 0x0u, 0x0u}, 1}, + {0xa661u, {0xa660u, 0x0u, 0x0u}, 1}, + {0xa663u, {0xa662u, 0x0u, 0x0u}, 1}, + {0xa665u, {0xa664u, 0x0u, 0x0u}, 1}, + {0xa667u, {0xa666u, 0x0u, 0x0u}, 1}, + {0xa669u, {0xa668u, 0x0u, 0x0u}, 1}, + {0xa66bu, {0xa66au, 0x0u, 0x0u}, 1}, + {0xa66du, {0xa66cu, 0x0u, 0x0u}, 1}, + {0xa681u, {0xa680u, 0x0u, 0x0u}, 1}, + {0xa683u, {0xa682u, 0x0u, 0x0u}, 1}, + {0xa685u, {0xa684u, 0x0u, 0x0u}, 1}, + {0xa687u, {0xa686u, 0x0u, 0x0u}, 1}, + {0xa689u, {0xa688u, 0x0u, 0x0u}, 1}, + {0xa68bu, {0xa68au, 0x0u, 0x0u}, 1}, + {0xa68du, {0xa68cu, 0x0u, 0x0u}, 1}, + {0xa68fu, {0xa68eu, 0x0u, 0x0u}, 1}, + {0xa691u, {0xa690u, 0x0u, 0x0u}, 1}, + {0xa693u, {0xa692u, 0x0u, 0x0u}, 1}, + {0xa695u, {0xa694u, 0x0u, 0x0u}, 1}, + {0xa697u, {0xa696u, 0x0u, 0x0u}, 1}, + {0xa699u, {0xa698u, 0x0u, 0x0u}, 1}, + {0xa69bu, {0xa69au, 0x0u, 0x0u}, 1}, + {0xa723u, {0xa722u, 0x0u, 0x0u}, 1}, + {0xa725u, {0xa724u, 0x0u, 0x0u}, 1}, + {0xa727u, {0xa726u, 0x0u, 0x0u}, 1}, + {0xa729u, {0xa728u, 0x0u, 0x0u}, 1}, + {0xa72bu, {0xa72au, 0x0u, 0x0u}, 1}, + {0xa72du, {0xa72cu, 0x0u, 0x0u}, 1}, + {0xa72fu, {0xa72eu, 0x0u, 0x0u}, 1}, + {0xa733u, {0xa732u, 0x0u, 0x0u}, 1}, + {0xa735u, {0xa734u, 0x0u, 0x0u}, 1}, + {0xa737u, {0xa736u, 0x0u, 0x0u}, 1}, + {0xa739u, {0xa738u, 0x0u, 0x0u}, 1}, + {0xa73bu, {0xa73au, 0x0u, 0x0u}, 1}, + {0xa73du, {0xa73cu, 0x0u, 0x0u}, 1}, + {0xa73fu, {0xa73eu, 0x0u, 0x0u}, 1}, + {0xa741u, {0xa740u, 0x0u, 0x0u}, 1}, + {0xa743u, {0xa742u, 0x0u, 0x0u}, 1}, + {0xa745u, {0xa744u, 0x0u, 0x0u}, 1}, + {0xa747u, {0xa746u, 0x0u, 0x0u}, 1}, + {0xa749u, {0xa748u, 0x0u, 0x0u}, 1}, + {0xa74bu, {0xa74au, 0x0u, 0x0u}, 1}, + {0xa74du, {0xa74cu, 0x0u, 0x0u}, 1}, + {0xa74fu, {0xa74eu, 0x0u, 0x0u}, 1}, + {0xa751u, {0xa750u, 0x0u, 0x0u}, 1}, + {0xa753u, {0xa752u, 0x0u, 0x0u}, 1}, + {0xa755u, {0xa754u, 0x0u, 0x0u}, 1}, + {0xa757u, {0xa756u, 0x0u, 0x0u}, 1}, + {0xa759u, {0xa758u, 0x0u, 0x0u}, 1}, + {0xa75bu, {0xa75au, 0x0u, 0x0u}, 1}, + {0xa75du, {0xa75cu, 0x0u, 0x0u}, 1}, + {0xa75fu, {0xa75eu, 0x0u, 0x0u}, 1}, + {0xa761u, {0xa760u, 0x0u, 0x0u}, 1}, + {0xa763u, {0xa762u, 0x0u, 0x0u}, 1}, + {0xa765u, {0xa764u, 0x0u, 0x0u}, 1}, + {0xa767u, {0xa766u, 0x0u, 0x0u}, 1}, + {0xa769u, {0xa768u, 0x0u, 0x0u}, 1}, + {0xa76bu, {0xa76au, 0x0u, 0x0u}, 1}, + {0xa76du, {0xa76cu, 0x0u, 0x0u}, 1}, + {0xa76fu, {0xa76eu, 0x0u, 0x0u}, 1}, + {0xa77au, {0xa779u, 0x0u, 0x0u}, 1}, + {0xa77cu, {0xa77bu, 0x0u, 0x0u}, 1}, + {0xa77fu, {0xa77eu, 0x0u, 0x0u}, 1}, + {0xa781u, {0xa780u, 0x0u, 0x0u}, 1}, + {0xa783u, {0xa782u, 0x0u, 0x0u}, 1}, + {0xa785u, {0xa784u, 0x0u, 0x0u}, 1}, + {0xa787u, {0xa786u, 0x0u, 0x0u}, 1}, + {0xa78cu, {0xa78bu, 0x0u, 0x0u}, 1}, + {0xa791u, {0xa790u, 0x0u, 0x0u}, 1}, + {0xa793u, {0xa792u, 0x0u, 0x0u}, 1}, + {0xa794u, {0xa7c4u, 0x0u, 0x0u}, 1}, + {0xa797u, {0xa796u, 0x0u, 0x0u}, 1}, + {0xa799u, {0xa798u, 0x0u, 0x0u}, 1}, + {0xa79bu, {0xa79au, 0x0u, 0x0u}, 1}, + {0xa79du, {0xa79cu, 0x0u, 0x0u}, 1}, + {0xa79fu, {0xa79eu, 0x0u, 0x0u}, 1}, + {0xa7a1u, {0xa7a0u, 0x0u, 0x0u}, 1}, + {0xa7a3u, {0xa7a2u, 0x0u, 0x0u}, 1}, + {0xa7a5u, {0xa7a4u, 0x0u, 0x0u}, 1}, + {0xa7a7u, {0xa7a6u, 0x0u, 0x0u}, 1}, + {0xa7a9u, {0xa7a8u, 0x0u, 0x0u}, 1}, + {0xa7b5u, {0xa7b4u, 0x0u, 0x0u}, 1}, + {0xa7b7u, {0xa7b6u, 0x0u, 0x0u}, 1}, + {0xa7b9u, {0xa7b8u, 0x0u, 0x0u}, 1}, + {0xa7bbu, {0xa7bau, 0x0u, 0x0u}, 1}, + {0xa7bdu, {0xa7bcu, 0x0u, 0x0u}, 1}, + {0xa7bfu, {0xa7beu, 0x0u, 0x0u}, 1}, + {0xa7c1u, {0xa7c0u, 0x0u, 0x0u}, 1}, + {0xa7c3u, {0xa7c2u, 0x0u, 0x0u}, 1}, + {0xa7c8u, {0xa7c7u, 0x0u, 0x0u}, 1}, + {0xa7cau, {0xa7c9u, 0x0u, 0x0u}, 1}, + {0xa7cdu, {0xa7ccu, 0x0u, 0x0u}, 1}, + {0xa7cfu, {0xa7ceu, 0x0u, 0x0u}, 1}, + {0xa7d1u, {0xa7d0u, 0x0u, 0x0u}, 1}, + {0xa7d3u, {0xa7d2u, 0x0u, 0x0u}, 1}, + {0xa7d5u, {0xa7d4u, 0x0u, 0x0u}, 1}, + {0xa7d7u, {0xa7d6u, 0x0u, 0x0u}, 1}, + {0xa7d9u, {0xa7d8u, 0x0u, 0x0u}, 1}, + {0xa7dbu, {0xa7dau, 0x0u, 0x0u}, 1}, + {0xa7f6u, {0xa7f5u, 0x0u, 0x0u}, 1}, + {0xab53u, {0xa7b3u, 0x0u, 0x0u}, 1}, + {0xab70u, {0x13a0u, 0x0u, 0x0u}, 1}, + {0xab71u, {0x13a1u, 0x0u, 0x0u}, 1}, + {0xab72u, {0x13a2u, 0x0u, 0x0u}, 1}, + {0xab73u, {0x13a3u, 0x0u, 0x0u}, 1}, + {0xab74u, {0x13a4u, 0x0u, 0x0u}, 1}, + {0xab75u, {0x13a5u, 0x0u, 0x0u}, 1}, + {0xab76u, {0x13a6u, 0x0u, 0x0u}, 1}, + {0xab77u, {0x13a7u, 0x0u, 0x0u}, 1}, + {0xab78u, {0x13a8u, 0x0u, 0x0u}, 1}, + {0xab79u, {0x13a9u, 0x0u, 0x0u}, 1}, + {0xab7au, {0x13aau, 0x0u, 0x0u}, 1}, + {0xab7bu, {0x13abu, 0x0u, 0x0u}, 1}, + {0xab7cu, {0x13acu, 0x0u, 0x0u}, 1}, + {0xab7du, {0x13adu, 0x0u, 0x0u}, 1}, + {0xab7eu, {0x13aeu, 0x0u, 0x0u}, 1}, + {0xab7fu, {0x13afu, 0x0u, 0x0u}, 1}, + {0xab80u, {0x13b0u, 0x0u, 0x0u}, 1}, + {0xab81u, {0x13b1u, 0x0u, 0x0u}, 1}, + {0xab82u, {0x13b2u, 0x0u, 0x0u}, 1}, + {0xab83u, {0x13b3u, 0x0u, 0x0u}, 1}, + {0xab84u, {0x13b4u, 0x0u, 0x0u}, 1}, + {0xab85u, {0x13b5u, 0x0u, 0x0u}, 1}, + {0xab86u, {0x13b6u, 0x0u, 0x0u}, 1}, + {0xab87u, {0x13b7u, 0x0u, 0x0u}, 1}, + {0xab88u, {0x13b8u, 0x0u, 0x0u}, 1}, + {0xab89u, {0x13b9u, 0x0u, 0x0u}, 1}, + {0xab8au, {0x13bau, 0x0u, 0x0u}, 1}, + {0xab8bu, {0x13bbu, 0x0u, 0x0u}, 1}, + {0xab8cu, {0x13bcu, 0x0u, 0x0u}, 1}, + {0xab8du, {0x13bdu, 0x0u, 0x0u}, 1}, + {0xab8eu, {0x13beu, 0x0u, 0x0u}, 1}, + {0xab8fu, {0x13bfu, 0x0u, 0x0u}, 1}, + {0xab90u, {0x13c0u, 0x0u, 0x0u}, 1}, + {0xab91u, {0x13c1u, 0x0u, 0x0u}, 1}, + {0xab92u, {0x13c2u, 0x0u, 0x0u}, 1}, + {0xab93u, {0x13c3u, 0x0u, 0x0u}, 1}, + {0xab94u, {0x13c4u, 0x0u, 0x0u}, 1}, + {0xab95u, {0x13c5u, 0x0u, 0x0u}, 1}, + {0xab96u, {0x13c6u, 0x0u, 0x0u}, 1}, + {0xab97u, {0x13c7u, 0x0u, 0x0u}, 1}, + {0xab98u, {0x13c8u, 0x0u, 0x0u}, 1}, + {0xab99u, {0x13c9u, 0x0u, 0x0u}, 1}, + {0xab9au, {0x13cau, 0x0u, 0x0u}, 1}, + {0xab9bu, {0x13cbu, 0x0u, 0x0u}, 1}, + {0xab9cu, {0x13ccu, 0x0u, 0x0u}, 1}, + {0xab9du, {0x13cdu, 0x0u, 0x0u}, 1}, + {0xab9eu, {0x13ceu, 0x0u, 0x0u}, 1}, + {0xab9fu, {0x13cfu, 0x0u, 0x0u}, 1}, + {0xaba0u, {0x13d0u, 0x0u, 0x0u}, 1}, + {0xaba1u, {0x13d1u, 0x0u, 0x0u}, 1}, + {0xaba2u, {0x13d2u, 0x0u, 0x0u}, 1}, + {0xaba3u, {0x13d3u, 0x0u, 0x0u}, 1}, + {0xaba4u, {0x13d4u, 0x0u, 0x0u}, 1}, + {0xaba5u, {0x13d5u, 0x0u, 0x0u}, 1}, + {0xaba6u, {0x13d6u, 0x0u, 0x0u}, 1}, + {0xaba7u, {0x13d7u, 0x0u, 0x0u}, 1}, + {0xaba8u, {0x13d8u, 0x0u, 0x0u}, 1}, + {0xaba9u, {0x13d9u, 0x0u, 0x0u}, 1}, + {0xabaau, {0x13dau, 0x0u, 0x0u}, 1}, + {0xababu, {0x13dbu, 0x0u, 0x0u}, 1}, + {0xabacu, {0x13dcu, 0x0u, 0x0u}, 1}, + {0xabadu, {0x13ddu, 0x0u, 0x0u}, 1}, + {0xabaeu, {0x13deu, 0x0u, 0x0u}, 1}, + {0xabafu, {0x13dfu, 0x0u, 0x0u}, 1}, + {0xabb0u, {0x13e0u, 0x0u, 0x0u}, 1}, + {0xabb1u, {0x13e1u, 0x0u, 0x0u}, 1}, + {0xabb2u, {0x13e2u, 0x0u, 0x0u}, 1}, + {0xabb3u, {0x13e3u, 0x0u, 0x0u}, 1}, + {0xabb4u, {0x13e4u, 0x0u, 0x0u}, 1}, + {0xabb5u, {0x13e5u, 0x0u, 0x0u}, 1}, + {0xabb6u, {0x13e6u, 0x0u, 0x0u}, 1}, + {0xabb7u, {0x13e7u, 0x0u, 0x0u}, 1}, + {0xabb8u, {0x13e8u, 0x0u, 0x0u}, 1}, + {0xabb9u, {0x13e9u, 0x0u, 0x0u}, 1}, + {0xabbau, {0x13eau, 0x0u, 0x0u}, 1}, + {0xabbbu, {0x13ebu, 0x0u, 0x0u}, 1}, + {0xabbcu, {0x13ecu, 0x0u, 0x0u}, 1}, + {0xabbdu, {0x13edu, 0x0u, 0x0u}, 1}, + {0xabbeu, {0x13eeu, 0x0u, 0x0u}, 1}, + {0xabbfu, {0x13efu, 0x0u, 0x0u}, 1}, + {0xfb00u, {0x46u, 0x46u, 0x0u}, 2}, + {0xfb01u, {0x46u, 0x49u, 0x0u}, 2}, + {0xfb02u, {0x46u, 0x4cu, 0x0u}, 2}, + {0xfb03u, {0x46u, 0x46u, 0x49u}, 3}, + {0xfb04u, {0x46u, 0x46u, 0x4cu}, 3}, + {0xfb05u, {0x53u, 0x54u, 0x0u}, 2}, + {0xfb06u, {0x53u, 0x54u, 0x0u}, 2}, + {0xfb13u, {0x544u, 0x546u, 0x0u}, 2}, + {0xfb14u, {0x544u, 0x535u, 0x0u}, 2}, + {0xfb15u, {0x544u, 0x53bu, 0x0u}, 2}, + {0xfb16u, {0x54eu, 0x546u, 0x0u}, 2}, + {0xfb17u, {0x544u, 0x53du, 0x0u}, 2}, + {0xff41u, {0xff21u, 0x0u, 0x0u}, 1}, + {0xff42u, {0xff22u, 0x0u, 0x0u}, 1}, + {0xff43u, {0xff23u, 0x0u, 0x0u}, 1}, + {0xff44u, {0xff24u, 0x0u, 0x0u}, 1}, + {0xff45u, {0xff25u, 0x0u, 0x0u}, 1}, + {0xff46u, {0xff26u, 0x0u, 0x0u}, 1}, + {0xff47u, {0xff27u, 0x0u, 0x0u}, 1}, + {0xff48u, {0xff28u, 0x0u, 0x0u}, 1}, + {0xff49u, {0xff29u, 0x0u, 0x0u}, 1}, + {0xff4au, {0xff2au, 0x0u, 0x0u}, 1}, + {0xff4bu, {0xff2bu, 0x0u, 0x0u}, 1}, + {0xff4cu, {0xff2cu, 0x0u, 0x0u}, 1}, + {0xff4du, {0xff2du, 0x0u, 0x0u}, 1}, + {0xff4eu, {0xff2eu, 0x0u, 0x0u}, 1}, + {0xff4fu, {0xff2fu, 0x0u, 0x0u}, 1}, + {0xff50u, {0xff30u, 0x0u, 0x0u}, 1}, + {0xff51u, {0xff31u, 0x0u, 0x0u}, 1}, + {0xff52u, {0xff32u, 0x0u, 0x0u}, 1}, + {0xff53u, {0xff33u, 0x0u, 0x0u}, 1}, + {0xff54u, {0xff34u, 0x0u, 0x0u}, 1}, + {0xff55u, {0xff35u, 0x0u, 0x0u}, 1}, + {0xff56u, {0xff36u, 0x0u, 0x0u}, 1}, + {0xff57u, {0xff37u, 0x0u, 0x0u}, 1}, + {0xff58u, {0xff38u, 0x0u, 0x0u}, 1}, + {0xff59u, {0xff39u, 0x0u, 0x0u}, 1}, + {0xff5au, {0xff3au, 0x0u, 0x0u}, 1}, + {0x10428u, {0x10400u, 0x0u, 0x0u}, 1}, + {0x10429u, {0x10401u, 0x0u, 0x0u}, 1}, + {0x1042au, {0x10402u, 0x0u, 0x0u}, 1}, + {0x1042bu, {0x10403u, 0x0u, 0x0u}, 1}, + {0x1042cu, {0x10404u, 0x0u, 0x0u}, 1}, + {0x1042du, {0x10405u, 0x0u, 0x0u}, 1}, + {0x1042eu, {0x10406u, 0x0u, 0x0u}, 1}, + {0x1042fu, {0x10407u, 0x0u, 0x0u}, 1}, + {0x10430u, {0x10408u, 0x0u, 0x0u}, 1}, + {0x10431u, {0x10409u, 0x0u, 0x0u}, 1}, + {0x10432u, {0x1040au, 0x0u, 0x0u}, 1}, + {0x10433u, {0x1040bu, 0x0u, 0x0u}, 1}, + {0x10434u, {0x1040cu, 0x0u, 0x0u}, 1}, + {0x10435u, {0x1040du, 0x0u, 0x0u}, 1}, + {0x10436u, {0x1040eu, 0x0u, 0x0u}, 1}, + {0x10437u, {0x1040fu, 0x0u, 0x0u}, 1}, + {0x10438u, {0x10410u, 0x0u, 0x0u}, 1}, + {0x10439u, {0x10411u, 0x0u, 0x0u}, 1}, + {0x1043au, {0x10412u, 0x0u, 0x0u}, 1}, + {0x1043bu, {0x10413u, 0x0u, 0x0u}, 1}, + {0x1043cu, {0x10414u, 0x0u, 0x0u}, 1}, + {0x1043du, {0x10415u, 0x0u, 0x0u}, 1}, + {0x1043eu, {0x10416u, 0x0u, 0x0u}, 1}, + {0x1043fu, {0x10417u, 0x0u, 0x0u}, 1}, + {0x10440u, {0x10418u, 0x0u, 0x0u}, 1}, + {0x10441u, {0x10419u, 0x0u, 0x0u}, 1}, + {0x10442u, {0x1041au, 0x0u, 0x0u}, 1}, + {0x10443u, {0x1041bu, 0x0u, 0x0u}, 1}, + {0x10444u, {0x1041cu, 0x0u, 0x0u}, 1}, + {0x10445u, {0x1041du, 0x0u, 0x0u}, 1}, + {0x10446u, {0x1041eu, 0x0u, 0x0u}, 1}, + {0x10447u, {0x1041fu, 0x0u, 0x0u}, 1}, + {0x10448u, {0x10420u, 0x0u, 0x0u}, 1}, + {0x10449u, {0x10421u, 0x0u, 0x0u}, 1}, + {0x1044au, {0x10422u, 0x0u, 0x0u}, 1}, + {0x1044bu, {0x10423u, 0x0u, 0x0u}, 1}, + {0x1044cu, {0x10424u, 0x0u, 0x0u}, 1}, + {0x1044du, {0x10425u, 0x0u, 0x0u}, 1}, + {0x1044eu, {0x10426u, 0x0u, 0x0u}, 1}, + {0x1044fu, {0x10427u, 0x0u, 0x0u}, 1}, + {0x104d8u, {0x104b0u, 0x0u, 0x0u}, 1}, + {0x104d9u, {0x104b1u, 0x0u, 0x0u}, 1}, + {0x104dau, {0x104b2u, 0x0u, 0x0u}, 1}, + {0x104dbu, {0x104b3u, 0x0u, 0x0u}, 1}, + {0x104dcu, {0x104b4u, 0x0u, 0x0u}, 1}, + {0x104ddu, {0x104b5u, 0x0u, 0x0u}, 1}, + {0x104deu, {0x104b6u, 0x0u, 0x0u}, 1}, + {0x104dfu, {0x104b7u, 0x0u, 0x0u}, 1}, + {0x104e0u, {0x104b8u, 0x0u, 0x0u}, 1}, + {0x104e1u, {0x104b9u, 0x0u, 0x0u}, 1}, + {0x104e2u, {0x104bau, 0x0u, 0x0u}, 1}, + {0x104e3u, {0x104bbu, 0x0u, 0x0u}, 1}, + {0x104e4u, {0x104bcu, 0x0u, 0x0u}, 1}, + {0x104e5u, {0x104bdu, 0x0u, 0x0u}, 1}, + {0x104e6u, {0x104beu, 0x0u, 0x0u}, 1}, + {0x104e7u, {0x104bfu, 0x0u, 0x0u}, 1}, + {0x104e8u, {0x104c0u, 0x0u, 0x0u}, 1}, + {0x104e9u, {0x104c1u, 0x0u, 0x0u}, 1}, + {0x104eau, {0x104c2u, 0x0u, 0x0u}, 1}, + {0x104ebu, {0x104c3u, 0x0u, 0x0u}, 1}, + {0x104ecu, {0x104c4u, 0x0u, 0x0u}, 1}, + {0x104edu, {0x104c5u, 0x0u, 0x0u}, 1}, + {0x104eeu, {0x104c6u, 0x0u, 0x0u}, 1}, + {0x104efu, {0x104c7u, 0x0u, 0x0u}, 1}, + {0x104f0u, {0x104c8u, 0x0u, 0x0u}, 1}, + {0x104f1u, {0x104c9u, 0x0u, 0x0u}, 1}, + {0x104f2u, {0x104cau, 0x0u, 0x0u}, 1}, + {0x104f3u, {0x104cbu, 0x0u, 0x0u}, 1}, + {0x104f4u, {0x104ccu, 0x0u, 0x0u}, 1}, + {0x104f5u, {0x104cdu, 0x0u, 0x0u}, 1}, + {0x104f6u, {0x104ceu, 0x0u, 0x0u}, 1}, + {0x104f7u, {0x104cfu, 0x0u, 0x0u}, 1}, + {0x104f8u, {0x104d0u, 0x0u, 0x0u}, 1}, + {0x104f9u, {0x104d1u, 0x0u, 0x0u}, 1}, + {0x104fau, {0x104d2u, 0x0u, 0x0u}, 1}, + {0x104fbu, {0x104d3u, 0x0u, 0x0u}, 1}, + {0x10597u, {0x10570u, 0x0u, 0x0u}, 1}, + {0x10598u, {0x10571u, 0x0u, 0x0u}, 1}, + {0x10599u, {0x10572u, 0x0u, 0x0u}, 1}, + {0x1059au, {0x10573u, 0x0u, 0x0u}, 1}, + {0x1059bu, {0x10574u, 0x0u, 0x0u}, 1}, + {0x1059cu, {0x10575u, 0x0u, 0x0u}, 1}, + {0x1059du, {0x10576u, 0x0u, 0x0u}, 1}, + {0x1059eu, {0x10577u, 0x0u, 0x0u}, 1}, + {0x1059fu, {0x10578u, 0x0u, 0x0u}, 1}, + {0x105a0u, {0x10579u, 0x0u, 0x0u}, 1}, + {0x105a1u, {0x1057au, 0x0u, 0x0u}, 1}, + {0x105a3u, {0x1057cu, 0x0u, 0x0u}, 1}, + {0x105a4u, {0x1057du, 0x0u, 0x0u}, 1}, + {0x105a5u, {0x1057eu, 0x0u, 0x0u}, 1}, + {0x105a6u, {0x1057fu, 0x0u, 0x0u}, 1}, + {0x105a7u, {0x10580u, 0x0u, 0x0u}, 1}, + {0x105a8u, {0x10581u, 0x0u, 0x0u}, 1}, + {0x105a9u, {0x10582u, 0x0u, 0x0u}, 1}, + {0x105aau, {0x10583u, 0x0u, 0x0u}, 1}, + {0x105abu, {0x10584u, 0x0u, 0x0u}, 1}, + {0x105acu, {0x10585u, 0x0u, 0x0u}, 1}, + {0x105adu, {0x10586u, 0x0u, 0x0u}, 1}, + {0x105aeu, {0x10587u, 0x0u, 0x0u}, 1}, + {0x105afu, {0x10588u, 0x0u, 0x0u}, 1}, + {0x105b0u, {0x10589u, 0x0u, 0x0u}, 1}, + {0x105b1u, {0x1058au, 0x0u, 0x0u}, 1}, + {0x105b3u, {0x1058cu, 0x0u, 0x0u}, 1}, + {0x105b4u, {0x1058du, 0x0u, 0x0u}, 1}, + {0x105b5u, {0x1058eu, 0x0u, 0x0u}, 1}, + {0x105b6u, {0x1058fu, 0x0u, 0x0u}, 1}, + {0x105b7u, {0x10590u, 0x0u, 0x0u}, 1}, + {0x105b8u, {0x10591u, 0x0u, 0x0u}, 1}, + {0x105b9u, {0x10592u, 0x0u, 0x0u}, 1}, + {0x105bbu, {0x10594u, 0x0u, 0x0u}, 1}, + {0x105bcu, {0x10595u, 0x0u, 0x0u}, 1}, + {0x10cc0u, {0x10c80u, 0x0u, 0x0u}, 1}, + {0x10cc1u, {0x10c81u, 0x0u, 0x0u}, 1}, + {0x10cc2u, {0x10c82u, 0x0u, 0x0u}, 1}, + {0x10cc3u, {0x10c83u, 0x0u, 0x0u}, 1}, + {0x10cc4u, {0x10c84u, 0x0u, 0x0u}, 1}, + {0x10cc5u, {0x10c85u, 0x0u, 0x0u}, 1}, + {0x10cc6u, {0x10c86u, 0x0u, 0x0u}, 1}, + {0x10cc7u, {0x10c87u, 0x0u, 0x0u}, 1}, + {0x10cc8u, {0x10c88u, 0x0u, 0x0u}, 1}, + {0x10cc9u, {0x10c89u, 0x0u, 0x0u}, 1}, + {0x10ccau, {0x10c8au, 0x0u, 0x0u}, 1}, + {0x10ccbu, {0x10c8bu, 0x0u, 0x0u}, 1}, + {0x10cccu, {0x10c8cu, 0x0u, 0x0u}, 1}, + {0x10ccdu, {0x10c8du, 0x0u, 0x0u}, 1}, + {0x10cceu, {0x10c8eu, 0x0u, 0x0u}, 1}, + {0x10ccfu, {0x10c8fu, 0x0u, 0x0u}, 1}, + {0x10cd0u, {0x10c90u, 0x0u, 0x0u}, 1}, + {0x10cd1u, {0x10c91u, 0x0u, 0x0u}, 1}, + {0x10cd2u, {0x10c92u, 0x0u, 0x0u}, 1}, + {0x10cd3u, {0x10c93u, 0x0u, 0x0u}, 1}, + {0x10cd4u, {0x10c94u, 0x0u, 0x0u}, 1}, + {0x10cd5u, {0x10c95u, 0x0u, 0x0u}, 1}, + {0x10cd6u, {0x10c96u, 0x0u, 0x0u}, 1}, + {0x10cd7u, {0x10c97u, 0x0u, 0x0u}, 1}, + {0x10cd8u, {0x10c98u, 0x0u, 0x0u}, 1}, + {0x10cd9u, {0x10c99u, 0x0u, 0x0u}, 1}, + {0x10cdau, {0x10c9au, 0x0u, 0x0u}, 1}, + {0x10cdbu, {0x10c9bu, 0x0u, 0x0u}, 1}, + {0x10cdcu, {0x10c9cu, 0x0u, 0x0u}, 1}, + {0x10cddu, {0x10c9du, 0x0u, 0x0u}, 1}, + {0x10cdeu, {0x10c9eu, 0x0u, 0x0u}, 1}, + {0x10cdfu, {0x10c9fu, 0x0u, 0x0u}, 1}, + {0x10ce0u, {0x10ca0u, 0x0u, 0x0u}, 1}, + {0x10ce1u, {0x10ca1u, 0x0u, 0x0u}, 1}, + {0x10ce2u, {0x10ca2u, 0x0u, 0x0u}, 1}, + {0x10ce3u, {0x10ca3u, 0x0u, 0x0u}, 1}, + {0x10ce4u, {0x10ca4u, 0x0u, 0x0u}, 1}, + {0x10ce5u, {0x10ca5u, 0x0u, 0x0u}, 1}, + {0x10ce6u, {0x10ca6u, 0x0u, 0x0u}, 1}, + {0x10ce7u, {0x10ca7u, 0x0u, 0x0u}, 1}, + {0x10ce8u, {0x10ca8u, 0x0u, 0x0u}, 1}, + {0x10ce9u, {0x10ca9u, 0x0u, 0x0u}, 1}, + {0x10ceau, {0x10caau, 0x0u, 0x0u}, 1}, + {0x10cebu, {0x10cabu, 0x0u, 0x0u}, 1}, + {0x10cecu, {0x10cacu, 0x0u, 0x0u}, 1}, + {0x10cedu, {0x10cadu, 0x0u, 0x0u}, 1}, + {0x10ceeu, {0x10caeu, 0x0u, 0x0u}, 1}, + {0x10cefu, {0x10cafu, 0x0u, 0x0u}, 1}, + {0x10cf0u, {0x10cb0u, 0x0u, 0x0u}, 1}, + {0x10cf1u, {0x10cb1u, 0x0u, 0x0u}, 1}, + {0x10cf2u, {0x10cb2u, 0x0u, 0x0u}, 1}, + {0x10d70u, {0x10d50u, 0x0u, 0x0u}, 1}, + {0x10d71u, {0x10d51u, 0x0u, 0x0u}, 1}, + {0x10d72u, {0x10d52u, 0x0u, 0x0u}, 1}, + {0x10d73u, {0x10d53u, 0x0u, 0x0u}, 1}, + {0x10d74u, {0x10d54u, 0x0u, 0x0u}, 1}, + {0x10d75u, {0x10d55u, 0x0u, 0x0u}, 1}, + {0x10d76u, {0x10d56u, 0x0u, 0x0u}, 1}, + {0x10d77u, {0x10d57u, 0x0u, 0x0u}, 1}, + {0x10d78u, {0x10d58u, 0x0u, 0x0u}, 1}, + {0x10d79u, {0x10d59u, 0x0u, 0x0u}, 1}, + {0x10d7au, {0x10d5au, 0x0u, 0x0u}, 1}, + {0x10d7bu, {0x10d5bu, 0x0u, 0x0u}, 1}, + {0x10d7cu, {0x10d5cu, 0x0u, 0x0u}, 1}, + {0x10d7du, {0x10d5du, 0x0u, 0x0u}, 1}, + {0x10d7eu, {0x10d5eu, 0x0u, 0x0u}, 1}, + {0x10d7fu, {0x10d5fu, 0x0u, 0x0u}, 1}, + {0x10d80u, {0x10d60u, 0x0u, 0x0u}, 1}, + {0x10d81u, {0x10d61u, 0x0u, 0x0u}, 1}, + {0x10d82u, {0x10d62u, 0x0u, 0x0u}, 1}, + {0x10d83u, {0x10d63u, 0x0u, 0x0u}, 1}, + {0x10d84u, {0x10d64u, 0x0u, 0x0u}, 1}, + {0x10d85u, {0x10d65u, 0x0u, 0x0u}, 1}, + {0x118c0u, {0x118a0u, 0x0u, 0x0u}, 1}, + {0x118c1u, {0x118a1u, 0x0u, 0x0u}, 1}, + {0x118c2u, {0x118a2u, 0x0u, 0x0u}, 1}, + {0x118c3u, {0x118a3u, 0x0u, 0x0u}, 1}, + {0x118c4u, {0x118a4u, 0x0u, 0x0u}, 1}, + {0x118c5u, {0x118a5u, 0x0u, 0x0u}, 1}, + {0x118c6u, {0x118a6u, 0x0u, 0x0u}, 1}, + {0x118c7u, {0x118a7u, 0x0u, 0x0u}, 1}, + {0x118c8u, {0x118a8u, 0x0u, 0x0u}, 1}, + {0x118c9u, {0x118a9u, 0x0u, 0x0u}, 1}, + {0x118cau, {0x118aau, 0x0u, 0x0u}, 1}, + {0x118cbu, {0x118abu, 0x0u, 0x0u}, 1}, + {0x118ccu, {0x118acu, 0x0u, 0x0u}, 1}, + {0x118cdu, {0x118adu, 0x0u, 0x0u}, 1}, + {0x118ceu, {0x118aeu, 0x0u, 0x0u}, 1}, + {0x118cfu, {0x118afu, 0x0u, 0x0u}, 1}, + {0x118d0u, {0x118b0u, 0x0u, 0x0u}, 1}, + {0x118d1u, {0x118b1u, 0x0u, 0x0u}, 1}, + {0x118d2u, {0x118b2u, 0x0u, 0x0u}, 1}, + {0x118d3u, {0x118b3u, 0x0u, 0x0u}, 1}, + {0x118d4u, {0x118b4u, 0x0u, 0x0u}, 1}, + {0x118d5u, {0x118b5u, 0x0u, 0x0u}, 1}, + {0x118d6u, {0x118b6u, 0x0u, 0x0u}, 1}, + {0x118d7u, {0x118b7u, 0x0u, 0x0u}, 1}, + {0x118d8u, {0x118b8u, 0x0u, 0x0u}, 1}, + {0x118d9u, {0x118b9u, 0x0u, 0x0u}, 1}, + {0x118dau, {0x118bau, 0x0u, 0x0u}, 1}, + {0x118dbu, {0x118bbu, 0x0u, 0x0u}, 1}, + {0x118dcu, {0x118bcu, 0x0u, 0x0u}, 1}, + {0x118ddu, {0x118bdu, 0x0u, 0x0u}, 1}, + {0x118deu, {0x118beu, 0x0u, 0x0u}, 1}, + {0x118dfu, {0x118bfu, 0x0u, 0x0u}, 1}, + {0x16e60u, {0x16e40u, 0x0u, 0x0u}, 1}, + {0x16e61u, {0x16e41u, 0x0u, 0x0u}, 1}, + {0x16e62u, {0x16e42u, 0x0u, 0x0u}, 1}, + {0x16e63u, {0x16e43u, 0x0u, 0x0u}, 1}, + {0x16e64u, {0x16e44u, 0x0u, 0x0u}, 1}, + {0x16e65u, {0x16e45u, 0x0u, 0x0u}, 1}, + {0x16e66u, {0x16e46u, 0x0u, 0x0u}, 1}, + {0x16e67u, {0x16e47u, 0x0u, 0x0u}, 1}, + {0x16e68u, {0x16e48u, 0x0u, 0x0u}, 1}, + {0x16e69u, {0x16e49u, 0x0u, 0x0u}, 1}, + {0x16e6au, {0x16e4au, 0x0u, 0x0u}, 1}, + {0x16e6bu, {0x16e4bu, 0x0u, 0x0u}, 1}, + {0x16e6cu, {0x16e4cu, 0x0u, 0x0u}, 1}, + {0x16e6du, {0x16e4du, 0x0u, 0x0u}, 1}, + {0x16e6eu, {0x16e4eu, 0x0u, 0x0u}, 1}, + {0x16e6fu, {0x16e4fu, 0x0u, 0x0u}, 1}, + {0x16e70u, {0x16e50u, 0x0u, 0x0u}, 1}, + {0x16e71u, {0x16e51u, 0x0u, 0x0u}, 1}, + {0x16e72u, {0x16e52u, 0x0u, 0x0u}, 1}, + {0x16e73u, {0x16e53u, 0x0u, 0x0u}, 1}, + {0x16e74u, {0x16e54u, 0x0u, 0x0u}, 1}, + {0x16e75u, {0x16e55u, 0x0u, 0x0u}, 1}, + {0x16e76u, {0x16e56u, 0x0u, 0x0u}, 1}, + {0x16e77u, {0x16e57u, 0x0u, 0x0u}, 1}, + {0x16e78u, {0x16e58u, 0x0u, 0x0u}, 1}, + {0x16e79u, {0x16e59u, 0x0u, 0x0u}, 1}, + {0x16e7au, {0x16e5au, 0x0u, 0x0u}, 1}, + {0x16e7bu, {0x16e5bu, 0x0u, 0x0u}, 1}, + {0x16e7cu, {0x16e5cu, 0x0u, 0x0u}, 1}, + {0x16e7du, {0x16e5du, 0x0u, 0x0u}, 1}, + {0x16e7eu, {0x16e5eu, 0x0u, 0x0u}, 1}, + {0x16e7fu, {0x16e5fu, 0x0u, 0x0u}, 1}, + {0x16ebbu, {0x16ea0u, 0x0u, 0x0u}, 1}, + {0x16ebcu, {0x16ea1u, 0x0u, 0x0u}, 1}, + {0x16ebdu, {0x16ea2u, 0x0u, 0x0u}, 1}, + {0x16ebeu, {0x16ea3u, 0x0u, 0x0u}, 1}, + {0x16ebfu, {0x16ea4u, 0x0u, 0x0u}, 1}, + {0x16ec0u, {0x16ea5u, 0x0u, 0x0u}, 1}, + {0x16ec1u, {0x16ea6u, 0x0u, 0x0u}, 1}, + {0x16ec2u, {0x16ea7u, 0x0u, 0x0u}, 1}, + {0x16ec3u, {0x16ea8u, 0x0u, 0x0u}, 1}, + {0x16ec4u, {0x16ea9u, 0x0u, 0x0u}, 1}, + {0x16ec5u, {0x16eaau, 0x0u, 0x0u}, 1}, + {0x16ec6u, {0x16eabu, 0x0u, 0x0u}, 1}, + {0x16ec7u, {0x16eacu, 0x0u, 0x0u}, 1}, + {0x16ec8u, {0x16eadu, 0x0u, 0x0u}, 1}, + {0x16ec9u, {0x16eaeu, 0x0u, 0x0u}, 1}, + {0x16ecau, {0x16eafu, 0x0u, 0x0u}, 1}, + {0x16ecbu, {0x16eb0u, 0x0u, 0x0u}, 1}, + {0x16eccu, {0x16eb1u, 0x0u, 0x0u}, 1}, + {0x16ecdu, {0x16eb2u, 0x0u, 0x0u}, 1}, + {0x16eceu, {0x16eb3u, 0x0u, 0x0u}, 1}, + {0x16ecfu, {0x16eb4u, 0x0u, 0x0u}, 1}, + {0x16ed0u, {0x16eb5u, 0x0u, 0x0u}, 1}, + {0x16ed1u, {0x16eb6u, 0x0u, 0x0u}, 1}, + {0x16ed2u, {0x16eb7u, 0x0u, 0x0u}, 1}, + {0x16ed3u, {0x16eb8u, 0x0u, 0x0u}, 1}, + {0x1e922u, {0x1e900u, 0x0u, 0x0u}, 1}, + {0x1e923u, {0x1e901u, 0x0u, 0x0u}, 1}, + {0x1e924u, {0x1e902u, 0x0u, 0x0u}, 1}, + {0x1e925u, {0x1e903u, 0x0u, 0x0u}, 1}, + {0x1e926u, {0x1e904u, 0x0u, 0x0u}, 1}, + {0x1e927u, {0x1e905u, 0x0u, 0x0u}, 1}, + {0x1e928u, {0x1e906u, 0x0u, 0x0u}, 1}, + {0x1e929u, {0x1e907u, 0x0u, 0x0u}, 1}, + {0x1e92au, {0x1e908u, 0x0u, 0x0u}, 1}, + {0x1e92bu, {0x1e909u, 0x0u, 0x0u}, 1}, + {0x1e92cu, {0x1e90au, 0x0u, 0x0u}, 1}, + {0x1e92du, {0x1e90bu, 0x0u, 0x0u}, 1}, + {0x1e92eu, {0x1e90cu, 0x0u, 0x0u}, 1}, + {0x1e92fu, {0x1e90du, 0x0u, 0x0u}, 1}, + {0x1e930u, {0x1e90eu, 0x0u, 0x0u}, 1}, + {0x1e931u, {0x1e90fu, 0x0u, 0x0u}, 1}, + {0x1e932u, {0x1e910u, 0x0u, 0x0u}, 1}, + {0x1e933u, {0x1e911u, 0x0u, 0x0u}, 1}, + {0x1e934u, {0x1e912u, 0x0u, 0x0u}, 1}, + {0x1e935u, {0x1e913u, 0x0u, 0x0u}, 1}, + {0x1e936u, {0x1e914u, 0x0u, 0x0u}, 1}, + {0x1e937u, {0x1e915u, 0x0u, 0x0u}, 1}, + {0x1e938u, {0x1e916u, 0x0u, 0x0u}, 1}, + {0x1e939u, {0x1e917u, 0x0u, 0x0u}, 1}, + {0x1e93au, {0x1e918u, 0x0u, 0x0u}, 1}, + {0x1e93bu, {0x1e919u, 0x0u, 0x0u}, 1}, + {0x1e93cu, {0x1e91au, 0x0u, 0x0u}, 1}, + {0x1e93du, {0x1e91bu, 0x0u, 0x0u}, 1}, + {0x1e93eu, {0x1e91cu, 0x0u, 0x0u}, 1}, + {0x1e93fu, {0x1e91du, 0x0u, 0x0u}, 1}, + {0x1e940u, {0x1e91eu, 0x0u, 0x0u}, 1}, + {0x1e941u, {0x1e91fu, 0x0u, 0x0u}, 1}, + {0x1e942u, {0x1e920u, 0x0u, 0x0u}, 1}, + {0x1e943u, {0x1e921u, 0x0u, 0x0u}, 1}, +}; +static const int kZeroUpperMapLen = 1580; + +#endif /* ZERO_UNICODE_CASE_DATA_H */ diff --git a/test/52.icu.js b/test/52.icu.js deleted file mode 100644 index cd61b7c..0000000 --- a/test/52.icu.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; -const os = require('os'); -const Database = require('../.'); - -// ICU is statically linked on macOS and Linux (see deps/icu.js and binding.gyp), -// which makes LIKE/lower()/upper() Unicode-aware. It is intentionally NOT linked -// on Windows (static ICU there is impractical to build in CI), so those builds -// keep SQLite's ASCII-only behavior. -const isWindows = os.platform().startsWith('win'); -const itWindows = isWindows ? it : it.skip; - -describe('ICU Unicode support', function () { - beforeEach(function () { - this.db = new Database(util.next()); - }); - afterEach(function () { - this.db.close(); - }); - - const evalScalar = function (db, expr) { - return db.prepare(`SELECT ${expr} AS v`).pluck().get(); - }; - - util.itUnix('case-folds non-ASCII characters when ICU is enabled', function () { - expect(evalScalar(this.db, "lower('Ä')")).to.equal('ä'); - expect(evalScalar(this.db, "upper('ß')")).to.equal('SS'); - // SQLite's LIKE is provided by ICU here, so it folds case across Unicode. - expect(evalScalar(this.db, "'Ä' LIKE 'ä'")).to.equal(1); - expect(evalScalar(this.db, "'ПРИВЕТ' LIKE 'привет'")).to.equal(1); - // Distinct characters still do not match. - expect(evalScalar(this.db, "'Ä' LIKE 'å'")).to.equal(0); - }); - - itWindows('leaves non-ASCII characters unchanged when ICU is disabled', function () { - expect(evalScalar(this.db, "lower('Ä')")).to.equal('Ä'); - expect(evalScalar(this.db, "'Ä' LIKE 'ä'")).to.equal(0); - // ASCII case-insensitivity still works without ICU. - expect(evalScalar(this.db, "'ABC' LIKE 'abc'")).to.equal(1); - }); -}); diff --git a/test/52.unicode-case.js b/test/52.unicode-case.js new file mode 100644 index 0000000..0111d3b --- /dev/null +++ b/test/52.unicode-case.js @@ -0,0 +1,75 @@ +'use strict'; +const Database = require('../.'); + +// The driver registers Unicode-aware lower()/upper() on every connection +// (src/util/unicode_case.cpp), replacing SQLite's ASCII-only built-ins with no +// ICU dependency. The case table is generated from Node's toLowerCase/ +// toUpperCase (deps/gen-unicode-case.mjs), so these match JavaScript. Works on +// every platform, including Windows. +describe('Unicode lower()/upper()', function () { + beforeEach(function () { + this.db = new Database(util.next()); + }); + afterEach(function () { + this.db.close(); + }); + + const lower = function (db, s) { + return db.prepare('SELECT lower(?) AS v').pluck().get(s); + }; + const upper = function (db, s) { + return db.prepare('SELECT upper(?) AS v').pluck().get(s); + }; + + it('lowercases non-ASCII characters', function () { + expect(lower(this.db, 'MÜLLER')).to.equal('müller'); + expect(lower(this.db, 'ПРИВЕТ')).to.equal('привет'); + expect(lower(this.db, 'CAFÉ')).to.equal('café'); + }); + + it('uppercases non-ASCII characters, including 1:many mappings', function () { + expect(upper(this.db, 'müller')).to.equal('MÜLLER'); + expect(upper(this.db, 'café')).to.equal('CAFÉ'); + expect(upper(this.db, 'ß')).to.equal('SS'); // 1 -> 2 code points + }); + + // The whole point of generating the table from Node is that the SQL functions + // match JavaScript's (context-free) case conversion, which the IVM relies on. + it('matches JavaScript toLowerCase/toUpperCase', function () { + const samples = [ + 'MÜLLER', + 'café', + 'ПРИВЕТ', + 'ΑΒΓ', // Greek (no word-final sigma; see note below) + 'İ', // dotted capital I -> 'i̇' (1 -> 2) + 'Dž', // titlecase digraph + 'Ⅻ', // roman numeral + 'ẞ', // capital sharp s -> 'ß' + 'straße', + 'a1!ä', + ]; + for (const s of samples) { + expect(lower(this.db, s), `lower(${s})`).to.equal(s.toLowerCase()); + expect(upper(this.db, s), `upper(${s})`).to.equal(s.toUpperCase()); + } + }); + + it('drives Unicode-insensitive ILIKE via lower()', function () { + // This is how zqlite compiles ILIKE. + const ilike = (a, b) => + this.db.prepare('SELECT (lower(?) LIKE lower(?)) AS v').pluck().get(a, b); + expect(ilike('MÜLLER', 'müller')).to.equal(1); + expect(ilike('Ä', 'ä')).to.equal(1); + expect(ilike('Ä', 'å')).to.equal(0); + }); + + it('passes NULL through and coerces non-text', function () { + expect(lower(this.db, null)).to.equal(null); + expect(this.db.prepare('SELECT lower(123) AS v').pluck().get()).to.equal('123'); + }); +}); + +// Note: case *folding* (ß <-> ss) and context rules (Greek word-final sigma) are +// intentionally not implemented — only context-free case mapping, matching JS +// toLowerCase/toUpperCase. The cross-backend parity test in the zero repo guards +// the behavior Zero actually depends on. From f209cac2caa0c75d528a440584f69fd0198cfc01 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 3 Jun 2026 16:57:07 +0200 Subject: [PATCH 2/6] unicode case: implement the Greek final-sigma rule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the one context-sensitive rule that JS toLowerCase applies in the default (locale-independent) algorithm: Σ lowercases to ς when preceded by a cased letter (skipping case-ignorable chars) and not followed by one, else σ. - Generator emits Cased / Case_Ignorable as code-point ranges (from the \p{Cased} / \p{Case_Ignorable} escapes, so they track V8's Unicode version). - lower() tracks prevCased and, for Σ, scans forward for a following cased letter (LowerSigma). upper() is unchanged. - Tests: add final-sigma cases and an exhaustive guard that lower()/upper() equal JS for every code point (verified: 0 mismatches across all 1,112,064). With this there is no remaining context divergence from JS toLowerCase/ toUpperCase within a Unicode version. Co-Authored-By: Claude Opus 4.8 (1M context) --- deps/gen-unicode-case.mjs | 51 ++- src/util/unicode_case.cpp | 70 +++- src/util/unicode_case_data.h | 640 ++++++++++++++++++++++++++++++++++- test/52.unicode-case.js | 46 ++- 4 files changed, 782 insertions(+), 25 deletions(-) diff --git a/deps/gen-unicode-case.mjs b/deps/gen-unicode-case.mjs index 37b1a4b..e14c188 100644 --- a/deps/gen-unicode-case.mjs +++ b/deps/gen-unicode-case.mjs @@ -2,20 +2,22 @@ // driver's Unicode-aware lower()/upper() SQL functions. // // The tables are generated from THIS Node's String.prototype.toLowerCase / -// toUpperCase. That makes the C implementation match JavaScript's (context-free) -// case conversion by construction — which is exactly the consistency the +// toUpperCase and the Cased / Case_Ignorable Unicode property escapes. That +// makes the C implementation match JavaScript's case conversion by construction +// (including the Greek final-sigma rule) — exactly the consistency the // client-side IVM matcher (toLowerCase) and the zqlite replica rely on. Case -// mappings are stable across Unicode versions, so this only needs regenerating -// on a deliberate Unicode bump. +// data is stable across Unicode versions, so this only needs regenerating on a +// deliberate Unicode bump. // // Usage: node deps/gen-unicode-case.mjs > src/util/unicode_case_data.h const MAX = 0x10ffff; +const isSurrogate = cp => cp >= 0xd800 && cp <= 0xdfff; function mappings(method) { const rows = []; for (let cp = 0; cp <= MAX; cp++) { - if (cp >= 0xd800 && cp <= 0xdfff) continue; // lone surrogates + if (isSurrogate(cp)) continue; // lone surrogates const ch = String.fromCodePoint(cp); const mapped = ch[method](); if (mapped === ch) continue; @@ -26,6 +28,33 @@ function mappings(method) { return rows; } +// Collapses the code points matching `re` into sorted [lo, hi] ranges. Used for +// the Cased / Case_Ignorable properties needed by the final-sigma rule. +function propertyRanges(re) { + const ranges = []; + let start = -1; + for (let cp = 0; cp <= MAX; cp++) { + const match = !isSurrogate(cp) && re.test(String.fromCodePoint(cp)); + if (match && start < 0) start = cp; + else if (!match && start >= 0) { + ranges.push([start, cp - 1]); + start = -1; + } + } + if (start >= 0) ranges.push([start, MAX]); + return ranges; +} + +function emitRanges(name, ranges) { + const lines = ranges.map( + ([lo, hi]) => ` {0x${lo.toString(16)}u, 0x${hi.toString(16)}u},`, + ); + return ( + `static const ZeroRange ${name}[] = {\n${lines.join('\n')}\n};\n` + + `static const int ${name}Len = ${ranges.length};\n` + ); +} + function emit(name, rows) { const lines = rows.map(([from, to]) => { const t = [...to, 0, 0, 0].slice(0, 3).map(c => `0x${c.toString(16)}u`); @@ -39,18 +68,26 @@ function emit(name, rows) { const lower = mappings('toLowerCase'); const upper = mappings('toUpperCase'); +const cased = propertyRanges(/\p{Cased}/u); +const caseIgnorable = propertyRanges(/\p{Case_Ignorable}/u); process.stdout.write( `// AUTO-GENERATED by deps/gen-unicode-case.mjs — DO NOT EDIT.\n` + `// Source: Node ${process.versions.node} (Unicode ${process.versions.unicode}).\n` + - `// Each row maps one source code point to 1-3 target code points, matching\n` + - `// JavaScript String.prototype.toLowerCase/toUpperCase (context-free).\n` + + `// Case maps: one source code point to 1-3 target code points, matching\n` + + `// JavaScript String.prototype.toLowerCase/toUpperCase. Cased / CaseIgnorable\n` + + `// are property ranges used by the Greek final-sigma rule.\n` + `#ifndef ZERO_UNICODE_CASE_DATA_H\n#define ZERO_UNICODE_CASE_DATA_H\n\n` + `typedef struct ZeroCaseMap {\n` + ` unsigned int from;\n unsigned int to[3];\n unsigned char n;\n` + `} ZeroCaseMap;\n\n` + + `typedef struct ZeroRange {\n unsigned int lo;\n unsigned int hi;\n} ZeroRange;\n\n` + emit('kZeroLowerMap', lower) + `\n` + emit('kZeroUpperMap', upper) + + `\n` + + emitRanges('kZeroCased', cased) + + `\n` + + emitRanges('kZeroCaseIgnorable', caseIgnorable) + `\n#endif /* ZERO_UNICODE_CASE_DATA_H */\n`, ); diff --git a/src/util/unicode_case.cpp b/src/util/unicode_case.cpp index 0210b97..5c04bad 100644 --- a/src/util/unicode_case.cpp +++ b/src/util/unicode_case.cpp @@ -5,10 +5,11 @@ // case conversion. Registered as an auto-extension, overriding SQLite's // ASCII-only built-in lower()/upper() on every connection. // -// Scope: context-free case mapping (the common case). It does not implement -// context-sensitive rules such as Greek final sigma; JavaScript's toLowerCase -// applies those, so a word-final Σ can differ. The zqlite ILIKE parity test -// guards the cases Zero relies on. +// This matches JavaScript's default (locale-independent) case conversion for +// all input: per-code-point full mappings plus the one context-sensitive rule +// that algorithm applies — Greek final sigma (see LowerSigma). Locale-specific +// rules (Turkish dotless i, Lithuanian) are not applied, and neither does +// String.prototype.toLowerCase, so the two stay consistent. #include "unicode_case_data.h" @@ -71,7 +72,47 @@ static const ZeroCaseMap* Lookup(const ZeroCaseMap* map, int len, unsigned int c return NULL; } -static void Apply(sqlite3_context* ctx, sqlite3_value* arg, const ZeroCaseMap* map, int len) { +// Whether `cp` falls in one of the sorted, non-overlapping [lo, hi] ranges. +static int InRanges(const ZeroRange* r, int len, unsigned int cp) { + int lo = 0, hi = len - 1; + while (lo <= hi) { + int mid = (lo + hi) >> 1; + if (cp < r[mid].lo) hi = mid - 1; + else if (cp > r[mid].hi) lo = mid + 1; + else return 1; + } + return 0; +} + +static int IsCased(unsigned int cp) { + return InRanges(kZeroCased, kZeroCasedLen, cp); +} +static int IsCaseIgnorable(unsigned int cp) { + return InRanges(kZeroCaseIgnorable, kZeroCaseIgnorableLen, cp); +} + +static const unsigned int kCapitalSigma = 0x3A3u; // Σ +static const unsigned int kSmallSigma = 0x3C3u; // σ +static const unsigned int kFinalSigma = 0x3C2u; // ς + +// Lowercasing Σ is the one context-sensitive rule in the default (locale- +// independent) algorithm that JS toLowerCase applies: Σ -> ς when it is preceded +// by a cased letter (ignoring case-ignorable chars) and not followed by one; +// otherwise Σ -> σ. `prevCased` is whether the last non-ignorable input char was +// cased; `in`/`n`/`after` scan the input following the Σ. +static unsigned int LowerSigma(const unsigned char* in, int n, int after, int prevCased) { + int followedByCased = 0; + int j = after; + while (j < n) { + unsigned int c = Utf8Decode(in, n, &j); + if (IsCaseIgnorable(c)) continue; + followedByCased = IsCased(c); + break; + } + return (prevCased && !followedByCased) ? kFinalSigma : kSmallSigma; +} + +static void Apply(sqlite3_context* ctx, sqlite3_value* arg, const ZeroCaseMap* map, int len, int lower) { if (sqlite3_value_type(arg) == SQLITE_NULL) { sqlite3_result_null(ctx); return; @@ -92,6 +133,7 @@ static void Apply(sqlite3_context* ctx, sqlite3_value* arg, const ZeroCaseMap* m } int outn = 0; int i = 0; + int prevCased = 0; // was the last non-case-ignorable input char cased? while (i < n) { unsigned int cp = Utf8Decode(in, n, &i); // Reserve room for up to 3 mapped code points (4 bytes each). @@ -105,24 +147,30 @@ static void Apply(sqlite3_context* ctx, sqlite3_value* arg, const ZeroCaseMap* m } out = grown; } - const ZeroCaseMap* m = Lookup(map, len, cp); - if (m) { - for (int k = 0; k < m->n; k++) outn += Utf8Encode(m->to[k], out + outn); + if (lower && cp == kCapitalSigma) { + outn += Utf8Encode(LowerSigma(in, n, i, prevCased), out + outn); } else { - outn += Utf8Encode(cp, out + outn); + const ZeroCaseMap* m = Lookup(map, len, cp); + if (m) { + for (int k = 0; k < m->n; k++) outn += Utf8Encode(m->to[k], out + outn); + } else { + outn += Utf8Encode(cp, out + outn); + } } + // Context for final-sigma is evaluated on the original input. + if (!IsCaseIgnorable(cp)) prevCased = IsCased(cp); } sqlite3_result_text(ctx, out, outn, sqlite3_free); } static void LowerFunc(sqlite3_context* ctx, int argc, sqlite3_value** argv) { (void)argc; - Apply(ctx, argv[0], kZeroLowerMap, kZeroLowerMapLen); + Apply(ctx, argv[0], kZeroLowerMap, kZeroLowerMapLen, 1); } static void UpperFunc(sqlite3_context* ctx, int argc, sqlite3_value** argv) { (void)argc; - Apply(ctx, argv[0], kZeroUpperMap, kZeroUpperMapLen); + Apply(ctx, argv[0], kZeroUpperMap, kZeroUpperMapLen, 0); } } // namespace UnicodeCase diff --git a/src/util/unicode_case_data.h b/src/util/unicode_case_data.h index 85a9a9a..35604a0 100644 --- a/src/util/unicode_case_data.h +++ b/src/util/unicode_case_data.h @@ -1,7 +1,8 @@ // AUTO-GENERATED by deps/gen-unicode-case.mjs — DO NOT EDIT. // Source: Node 24.16.0 (Unicode 17.0). -// Each row maps one source code point to 1-3 target code points, matching -// JavaScript String.prototype.toLowerCase/toUpperCase (context-free). +// Case maps: one source code point to 1-3 target code points, matching +// JavaScript String.prototype.toLowerCase/toUpperCase. Cased / CaseIgnorable +// are property ranges used by the Greek final-sigma rule. #ifndef ZERO_UNICODE_CASE_DATA_H #define ZERO_UNICODE_CASE_DATA_H @@ -11,6 +12,11 @@ typedef struct ZeroCaseMap { unsigned char n; } ZeroCaseMap; +typedef struct ZeroRange { + unsigned int lo; + unsigned int hi; +} ZeroRange; + static const ZeroCaseMap kZeroLowerMap[] = { {0x41u, {0x61u, 0x0u, 0x0u}, 1}, {0x42u, {0x62u, 0x0u, 0x0u}, 1}, @@ -3087,4 +3093,634 @@ static const ZeroCaseMap kZeroUpperMap[] = { }; static const int kZeroUpperMapLen = 1580; +static const ZeroRange kZeroCased[] = { + {0x41u, 0x5au}, + {0x61u, 0x7au}, + {0xaau, 0xaau}, + {0xb5u, 0xb5u}, + {0xbau, 0xbau}, + {0xc0u, 0xd6u}, + {0xd8u, 0xf6u}, + {0xf8u, 0x1bau}, + {0x1bcu, 0x1bfu}, + {0x1c4u, 0x293u}, + {0x296u, 0x2b8u}, + {0x2c0u, 0x2c1u}, + {0x2e0u, 0x2e4u}, + {0x345u, 0x345u}, + {0x370u, 0x373u}, + {0x376u, 0x377u}, + {0x37au, 0x37du}, + {0x37fu, 0x37fu}, + {0x386u, 0x386u}, + {0x388u, 0x38au}, + {0x38cu, 0x38cu}, + {0x38eu, 0x3a1u}, + {0x3a3u, 0x3f5u}, + {0x3f7u, 0x481u}, + {0x48au, 0x52fu}, + {0x531u, 0x556u}, + {0x560u, 0x588u}, + {0x10a0u, 0x10c5u}, + {0x10c7u, 0x10c7u}, + {0x10cdu, 0x10cdu}, + {0x10d0u, 0x10fau}, + {0x10fcu, 0x10ffu}, + {0x13a0u, 0x13f5u}, + {0x13f8u, 0x13fdu}, + {0x1c80u, 0x1c8au}, + {0x1c90u, 0x1cbau}, + {0x1cbdu, 0x1cbfu}, + {0x1d00u, 0x1dbfu}, + {0x1e00u, 0x1f15u}, + {0x1f18u, 0x1f1du}, + {0x1f20u, 0x1f45u}, + {0x1f48u, 0x1f4du}, + {0x1f50u, 0x1f57u}, + {0x1f59u, 0x1f59u}, + {0x1f5bu, 0x1f5bu}, + {0x1f5du, 0x1f5du}, + {0x1f5fu, 0x1f7du}, + {0x1f80u, 0x1fb4u}, + {0x1fb6u, 0x1fbcu}, + {0x1fbeu, 0x1fbeu}, + {0x1fc2u, 0x1fc4u}, + {0x1fc6u, 0x1fccu}, + {0x1fd0u, 0x1fd3u}, + {0x1fd6u, 0x1fdbu}, + {0x1fe0u, 0x1fecu}, + {0x1ff2u, 0x1ff4u}, + {0x1ff6u, 0x1ffcu}, + {0x2071u, 0x2071u}, + {0x207fu, 0x207fu}, + {0x2090u, 0x209cu}, + {0x2102u, 0x2102u}, + {0x2107u, 0x2107u}, + {0x210au, 0x2113u}, + {0x2115u, 0x2115u}, + {0x2119u, 0x211du}, + {0x2124u, 0x2124u}, + {0x2126u, 0x2126u}, + {0x2128u, 0x2128u}, + {0x212au, 0x212du}, + {0x212fu, 0x2134u}, + {0x2139u, 0x2139u}, + {0x213cu, 0x213fu}, + {0x2145u, 0x2149u}, + {0x214eu, 0x214eu}, + {0x2160u, 0x217fu}, + {0x2183u, 0x2184u}, + {0x24b6u, 0x24e9u}, + {0x2c00u, 0x2ce4u}, + {0x2cebu, 0x2ceeu}, + {0x2cf2u, 0x2cf3u}, + {0x2d00u, 0x2d25u}, + {0x2d27u, 0x2d27u}, + {0x2d2du, 0x2d2du}, + {0xa640u, 0xa66du}, + {0xa680u, 0xa69du}, + {0xa722u, 0xa787u}, + {0xa78bu, 0xa78eu}, + {0xa790u, 0xa7dcu}, + {0xa7f1u, 0xa7f6u}, + {0xa7f8u, 0xa7fau}, + {0xab30u, 0xab5au}, + {0xab5cu, 0xab69u}, + {0xab70u, 0xabbfu}, + {0xfb00u, 0xfb06u}, + {0xfb13u, 0xfb17u}, + {0xff21u, 0xff3au}, + {0xff41u, 0xff5au}, + {0x10400u, 0x1044fu}, + {0x104b0u, 0x104d3u}, + {0x104d8u, 0x104fbu}, + {0x10570u, 0x1057au}, + {0x1057cu, 0x1058au}, + {0x1058cu, 0x10592u}, + {0x10594u, 0x10595u}, + {0x10597u, 0x105a1u}, + {0x105a3u, 0x105b1u}, + {0x105b3u, 0x105b9u}, + {0x105bbu, 0x105bcu}, + {0x10780u, 0x10780u}, + {0x10783u, 0x10785u}, + {0x10787u, 0x107b0u}, + {0x107b2u, 0x107bau}, + {0x10c80u, 0x10cb2u}, + {0x10cc0u, 0x10cf2u}, + {0x10d50u, 0x10d65u}, + {0x10d70u, 0x10d85u}, + {0x118a0u, 0x118dfu}, + {0x16e40u, 0x16e7fu}, + {0x16ea0u, 0x16eb8u}, + {0x16ebbu, 0x16ed3u}, + {0x1d400u, 0x1d454u}, + {0x1d456u, 0x1d49cu}, + {0x1d49eu, 0x1d49fu}, + {0x1d4a2u, 0x1d4a2u}, + {0x1d4a5u, 0x1d4a6u}, + {0x1d4a9u, 0x1d4acu}, + {0x1d4aeu, 0x1d4b9u}, + {0x1d4bbu, 0x1d4bbu}, + {0x1d4bdu, 0x1d4c3u}, + {0x1d4c5u, 0x1d505u}, + {0x1d507u, 0x1d50au}, + {0x1d50du, 0x1d514u}, + {0x1d516u, 0x1d51cu}, + {0x1d51eu, 0x1d539u}, + {0x1d53bu, 0x1d53eu}, + {0x1d540u, 0x1d544u}, + {0x1d546u, 0x1d546u}, + {0x1d54au, 0x1d550u}, + {0x1d552u, 0x1d6a5u}, + {0x1d6a8u, 0x1d6c0u}, + {0x1d6c2u, 0x1d6dau}, + {0x1d6dcu, 0x1d6fau}, + {0x1d6fcu, 0x1d714u}, + {0x1d716u, 0x1d734u}, + {0x1d736u, 0x1d74eu}, + {0x1d750u, 0x1d76eu}, + {0x1d770u, 0x1d788u}, + {0x1d78au, 0x1d7a8u}, + {0x1d7aau, 0x1d7c2u}, + {0x1d7c4u, 0x1d7cbu}, + {0x1df00u, 0x1df09u}, + {0x1df0bu, 0x1df1eu}, + {0x1df25u, 0x1df2au}, + {0x1e030u, 0x1e06du}, + {0x1e900u, 0x1e943u}, + {0x1f130u, 0x1f149u}, + {0x1f150u, 0x1f169u}, + {0x1f170u, 0x1f189u}, +}; +static const int kZeroCasedLen = 158; + +static const ZeroRange kZeroCaseIgnorable[] = { + {0x27u, 0x27u}, + {0x2eu, 0x2eu}, + {0x3au, 0x3au}, + {0x5eu, 0x5eu}, + {0x60u, 0x60u}, + {0xa8u, 0xa8u}, + {0xadu, 0xadu}, + {0xafu, 0xafu}, + {0xb4u, 0xb4u}, + {0xb7u, 0xb8u}, + {0x2b0u, 0x36fu}, + {0x374u, 0x375u}, + {0x37au, 0x37au}, + {0x384u, 0x385u}, + {0x387u, 0x387u}, + {0x483u, 0x489u}, + {0x559u, 0x559u}, + {0x55fu, 0x55fu}, + {0x591u, 0x5bdu}, + {0x5bfu, 0x5bfu}, + {0x5c1u, 0x5c2u}, + {0x5c4u, 0x5c5u}, + {0x5c7u, 0x5c7u}, + {0x5f4u, 0x5f4u}, + {0x600u, 0x605u}, + {0x610u, 0x61au}, + {0x61cu, 0x61cu}, + {0x640u, 0x640u}, + {0x64bu, 0x65fu}, + {0x670u, 0x670u}, + {0x6d6u, 0x6ddu}, + {0x6dfu, 0x6e8u}, + {0x6eau, 0x6edu}, + {0x70fu, 0x70fu}, + {0x711u, 0x711u}, + {0x730u, 0x74au}, + {0x7a6u, 0x7b0u}, + {0x7ebu, 0x7f5u}, + {0x7fau, 0x7fau}, + {0x7fdu, 0x7fdu}, + {0x816u, 0x82du}, + {0x859u, 0x85bu}, + {0x888u, 0x888u}, + {0x890u, 0x891u}, + {0x897u, 0x89fu}, + {0x8c9u, 0x902u}, + {0x93au, 0x93au}, + {0x93cu, 0x93cu}, + {0x941u, 0x948u}, + {0x94du, 0x94du}, + {0x951u, 0x957u}, + {0x962u, 0x963u}, + {0x971u, 0x971u}, + {0x981u, 0x981u}, + {0x9bcu, 0x9bcu}, + {0x9c1u, 0x9c4u}, + {0x9cdu, 0x9cdu}, + {0x9e2u, 0x9e3u}, + {0x9feu, 0x9feu}, + {0xa01u, 0xa02u}, + {0xa3cu, 0xa3cu}, + {0xa41u, 0xa42u}, + {0xa47u, 0xa48u}, + {0xa4bu, 0xa4du}, + {0xa51u, 0xa51u}, + {0xa70u, 0xa71u}, + {0xa75u, 0xa75u}, + {0xa81u, 0xa82u}, + {0xabcu, 0xabcu}, + {0xac1u, 0xac5u}, + {0xac7u, 0xac8u}, + {0xacdu, 0xacdu}, + {0xae2u, 0xae3u}, + {0xafau, 0xaffu}, + {0xb01u, 0xb01u}, + {0xb3cu, 0xb3cu}, + {0xb3fu, 0xb3fu}, + {0xb41u, 0xb44u}, + {0xb4du, 0xb4du}, + {0xb55u, 0xb56u}, + {0xb62u, 0xb63u}, + {0xb82u, 0xb82u}, + {0xbc0u, 0xbc0u}, + {0xbcdu, 0xbcdu}, + {0xc00u, 0xc00u}, + {0xc04u, 0xc04u}, + {0xc3cu, 0xc3cu}, + {0xc3eu, 0xc40u}, + {0xc46u, 0xc48u}, + {0xc4au, 0xc4du}, + {0xc55u, 0xc56u}, + {0xc62u, 0xc63u}, + {0xc81u, 0xc81u}, + {0xcbcu, 0xcbcu}, + {0xcbfu, 0xcbfu}, + {0xcc6u, 0xcc6u}, + {0xcccu, 0xccdu}, + {0xce2u, 0xce3u}, + {0xd00u, 0xd01u}, + {0xd3bu, 0xd3cu}, + {0xd41u, 0xd44u}, + {0xd4du, 0xd4du}, + {0xd62u, 0xd63u}, + {0xd81u, 0xd81u}, + {0xdcau, 0xdcau}, + {0xdd2u, 0xdd4u}, + {0xdd6u, 0xdd6u}, + {0xe31u, 0xe31u}, + {0xe34u, 0xe3au}, + {0xe46u, 0xe4eu}, + {0xeb1u, 0xeb1u}, + {0xeb4u, 0xebcu}, + {0xec6u, 0xec6u}, + {0xec8u, 0xeceu}, + {0xf18u, 0xf19u}, + {0xf35u, 0xf35u}, + {0xf37u, 0xf37u}, + {0xf39u, 0xf39u}, + {0xf71u, 0xf7eu}, + {0xf80u, 0xf84u}, + {0xf86u, 0xf87u}, + {0xf8du, 0xf97u}, + {0xf99u, 0xfbcu}, + {0xfc6u, 0xfc6u}, + {0x102du, 0x1030u}, + {0x1032u, 0x1037u}, + {0x1039u, 0x103au}, + {0x103du, 0x103eu}, + {0x1058u, 0x1059u}, + {0x105eu, 0x1060u}, + {0x1071u, 0x1074u}, + {0x1082u, 0x1082u}, + {0x1085u, 0x1086u}, + {0x108du, 0x108du}, + {0x109du, 0x109du}, + {0x10fcu, 0x10fcu}, + {0x135du, 0x135fu}, + {0x1712u, 0x1714u}, + {0x1732u, 0x1733u}, + {0x1752u, 0x1753u}, + {0x1772u, 0x1773u}, + {0x17b4u, 0x17b5u}, + {0x17b7u, 0x17bdu}, + {0x17c6u, 0x17c6u}, + {0x17c9u, 0x17d3u}, + {0x17d7u, 0x17d7u}, + {0x17ddu, 0x17ddu}, + {0x180bu, 0x180fu}, + {0x1843u, 0x1843u}, + {0x1885u, 0x1886u}, + {0x18a9u, 0x18a9u}, + {0x1920u, 0x1922u}, + {0x1927u, 0x1928u}, + {0x1932u, 0x1932u}, + {0x1939u, 0x193bu}, + {0x1a17u, 0x1a18u}, + {0x1a1bu, 0x1a1bu}, + {0x1a56u, 0x1a56u}, + {0x1a58u, 0x1a5eu}, + {0x1a60u, 0x1a60u}, + {0x1a62u, 0x1a62u}, + {0x1a65u, 0x1a6cu}, + {0x1a73u, 0x1a7cu}, + {0x1a7fu, 0x1a7fu}, + {0x1aa7u, 0x1aa7u}, + {0x1ab0u, 0x1addu}, + {0x1ae0u, 0x1aebu}, + {0x1b00u, 0x1b03u}, + {0x1b34u, 0x1b34u}, + {0x1b36u, 0x1b3au}, + {0x1b3cu, 0x1b3cu}, + {0x1b42u, 0x1b42u}, + {0x1b6bu, 0x1b73u}, + {0x1b80u, 0x1b81u}, + {0x1ba2u, 0x1ba5u}, + {0x1ba8u, 0x1ba9u}, + {0x1babu, 0x1badu}, + {0x1be6u, 0x1be6u}, + {0x1be8u, 0x1be9u}, + {0x1bedu, 0x1bedu}, + {0x1befu, 0x1bf1u}, + {0x1c2cu, 0x1c33u}, + {0x1c36u, 0x1c37u}, + {0x1c78u, 0x1c7du}, + {0x1cd0u, 0x1cd2u}, + {0x1cd4u, 0x1ce0u}, + {0x1ce2u, 0x1ce8u}, + {0x1cedu, 0x1cedu}, + {0x1cf4u, 0x1cf4u}, + {0x1cf8u, 0x1cf9u}, + {0x1d2cu, 0x1d6au}, + {0x1d78u, 0x1d78u}, + {0x1d9bu, 0x1dffu}, + {0x1fbdu, 0x1fbdu}, + {0x1fbfu, 0x1fc1u}, + {0x1fcdu, 0x1fcfu}, + {0x1fddu, 0x1fdfu}, + {0x1fedu, 0x1fefu}, + {0x1ffdu, 0x1ffeu}, + {0x200bu, 0x200fu}, + {0x2018u, 0x2019u}, + {0x2024u, 0x2024u}, + {0x2027u, 0x2027u}, + {0x202au, 0x202eu}, + {0x2060u, 0x2064u}, + {0x2066u, 0x206fu}, + {0x2071u, 0x2071u}, + {0x207fu, 0x207fu}, + {0x2090u, 0x209cu}, + {0x20d0u, 0x20f0u}, + {0x2c7cu, 0x2c7du}, + {0x2cefu, 0x2cf1u}, + {0x2d6fu, 0x2d6fu}, + {0x2d7fu, 0x2d7fu}, + {0x2de0u, 0x2dffu}, + {0x2e2fu, 0x2e2fu}, + {0x3005u, 0x3005u}, + {0x302au, 0x302du}, + {0x3031u, 0x3035u}, + {0x303bu, 0x303bu}, + {0x3099u, 0x309eu}, + {0x30fcu, 0x30feu}, + {0xa015u, 0xa015u}, + {0xa4f8u, 0xa4fdu}, + {0xa60cu, 0xa60cu}, + {0xa66fu, 0xa672u}, + {0xa674u, 0xa67du}, + {0xa67fu, 0xa67fu}, + {0xa69cu, 0xa69fu}, + {0xa6f0u, 0xa6f1u}, + {0xa700u, 0xa721u}, + {0xa770u, 0xa770u}, + {0xa788u, 0xa78au}, + {0xa7f1u, 0xa7f4u}, + {0xa7f8u, 0xa7f9u}, + {0xa802u, 0xa802u}, + {0xa806u, 0xa806u}, + {0xa80bu, 0xa80bu}, + {0xa825u, 0xa826u}, + {0xa82cu, 0xa82cu}, + {0xa8c4u, 0xa8c5u}, + {0xa8e0u, 0xa8f1u}, + {0xa8ffu, 0xa8ffu}, + {0xa926u, 0xa92du}, + {0xa947u, 0xa951u}, + {0xa980u, 0xa982u}, + {0xa9b3u, 0xa9b3u}, + {0xa9b6u, 0xa9b9u}, + {0xa9bcu, 0xa9bdu}, + {0xa9cfu, 0xa9cfu}, + {0xa9e5u, 0xa9e6u}, + {0xaa29u, 0xaa2eu}, + {0xaa31u, 0xaa32u}, + {0xaa35u, 0xaa36u}, + {0xaa43u, 0xaa43u}, + {0xaa4cu, 0xaa4cu}, + {0xaa70u, 0xaa70u}, + {0xaa7cu, 0xaa7cu}, + {0xaab0u, 0xaab0u}, + {0xaab2u, 0xaab4u}, + {0xaab7u, 0xaab8u}, + {0xaabeu, 0xaabfu}, + {0xaac1u, 0xaac1u}, + {0xaaddu, 0xaaddu}, + {0xaaecu, 0xaaedu}, + {0xaaf3u, 0xaaf4u}, + {0xaaf6u, 0xaaf6u}, + {0xab5bu, 0xab5fu}, + {0xab69u, 0xab6bu}, + {0xabe5u, 0xabe5u}, + {0xabe8u, 0xabe8u}, + {0xabedu, 0xabedu}, + {0xfb1eu, 0xfb1eu}, + {0xfbb2u, 0xfbc2u}, + {0xfe00u, 0xfe0fu}, + {0xfe13u, 0xfe13u}, + {0xfe20u, 0xfe2fu}, + {0xfe52u, 0xfe52u}, + {0xfe55u, 0xfe55u}, + {0xfeffu, 0xfeffu}, + {0xff07u, 0xff07u}, + {0xff0eu, 0xff0eu}, + {0xff1au, 0xff1au}, + {0xff3eu, 0xff3eu}, + {0xff40u, 0xff40u}, + {0xff70u, 0xff70u}, + {0xff9eu, 0xff9fu}, + {0xffe3u, 0xffe3u}, + {0xfff9u, 0xfffbu}, + {0x101fdu, 0x101fdu}, + {0x102e0u, 0x102e0u}, + {0x10376u, 0x1037au}, + {0x10780u, 0x10785u}, + {0x10787u, 0x107b0u}, + {0x107b2u, 0x107bau}, + {0x10a01u, 0x10a03u}, + {0x10a05u, 0x10a06u}, + {0x10a0cu, 0x10a0fu}, + {0x10a38u, 0x10a3au}, + {0x10a3fu, 0x10a3fu}, + {0x10ae5u, 0x10ae6u}, + {0x10d24u, 0x10d27u}, + {0x10d4eu, 0x10d4eu}, + {0x10d69u, 0x10d6du}, + {0x10d6fu, 0x10d6fu}, + {0x10eabu, 0x10eacu}, + {0x10ec5u, 0x10ec5u}, + {0x10efau, 0x10effu}, + {0x10f46u, 0x10f50u}, + {0x10f82u, 0x10f85u}, + {0x11001u, 0x11001u}, + {0x11038u, 0x11046u}, + {0x11070u, 0x11070u}, + {0x11073u, 0x11074u}, + {0x1107fu, 0x11081u}, + {0x110b3u, 0x110b6u}, + {0x110b9u, 0x110bau}, + {0x110bdu, 0x110bdu}, + {0x110c2u, 0x110c2u}, + {0x110cdu, 0x110cdu}, + {0x11100u, 0x11102u}, + {0x11127u, 0x1112bu}, + {0x1112du, 0x11134u}, + {0x11173u, 0x11173u}, + {0x11180u, 0x11181u}, + {0x111b6u, 0x111beu}, + {0x111c9u, 0x111ccu}, + {0x111cfu, 0x111cfu}, + {0x1122fu, 0x11231u}, + {0x11234u, 0x11234u}, + {0x11236u, 0x11237u}, + {0x1123eu, 0x1123eu}, + {0x11241u, 0x11241u}, + {0x112dfu, 0x112dfu}, + {0x112e3u, 0x112eau}, + {0x11300u, 0x11301u}, + {0x1133bu, 0x1133cu}, + {0x11340u, 0x11340u}, + {0x11366u, 0x1136cu}, + {0x11370u, 0x11374u}, + {0x113bbu, 0x113c0u}, + {0x113ceu, 0x113ceu}, + {0x113d0u, 0x113d0u}, + {0x113d2u, 0x113d2u}, + {0x113e1u, 0x113e2u}, + {0x11438u, 0x1143fu}, + {0x11442u, 0x11444u}, + {0x11446u, 0x11446u}, + {0x1145eu, 0x1145eu}, + {0x114b3u, 0x114b8u}, + {0x114bau, 0x114bau}, + {0x114bfu, 0x114c0u}, + {0x114c2u, 0x114c3u}, + {0x115b2u, 0x115b5u}, + {0x115bcu, 0x115bdu}, + {0x115bfu, 0x115c0u}, + {0x115dcu, 0x115ddu}, + {0x11633u, 0x1163au}, + {0x1163du, 0x1163du}, + {0x1163fu, 0x11640u}, + {0x116abu, 0x116abu}, + {0x116adu, 0x116adu}, + {0x116b0u, 0x116b5u}, + {0x116b7u, 0x116b7u}, + {0x1171du, 0x1171du}, + {0x1171fu, 0x1171fu}, + {0x11722u, 0x11725u}, + {0x11727u, 0x1172bu}, + {0x1182fu, 0x11837u}, + {0x11839u, 0x1183au}, + {0x1193bu, 0x1193cu}, + {0x1193eu, 0x1193eu}, + {0x11943u, 0x11943u}, + {0x119d4u, 0x119d7u}, + {0x119dau, 0x119dbu}, + {0x119e0u, 0x119e0u}, + {0x11a01u, 0x11a0au}, + {0x11a33u, 0x11a38u}, + {0x11a3bu, 0x11a3eu}, + {0x11a47u, 0x11a47u}, + {0x11a51u, 0x11a56u}, + {0x11a59u, 0x11a5bu}, + {0x11a8au, 0x11a96u}, + {0x11a98u, 0x11a99u}, + {0x11b60u, 0x11b60u}, + {0x11b62u, 0x11b64u}, + {0x11b66u, 0x11b66u}, + {0x11c30u, 0x11c36u}, + {0x11c38u, 0x11c3du}, + {0x11c3fu, 0x11c3fu}, + {0x11c92u, 0x11ca7u}, + {0x11caau, 0x11cb0u}, + {0x11cb2u, 0x11cb3u}, + {0x11cb5u, 0x11cb6u}, + {0x11d31u, 0x11d36u}, + {0x11d3au, 0x11d3au}, + {0x11d3cu, 0x11d3du}, + {0x11d3fu, 0x11d45u}, + {0x11d47u, 0x11d47u}, + {0x11d90u, 0x11d91u}, + {0x11d95u, 0x11d95u}, + {0x11d97u, 0x11d97u}, + {0x11dd9u, 0x11dd9u}, + {0x11ef3u, 0x11ef4u}, + {0x11f00u, 0x11f01u}, + {0x11f36u, 0x11f3au}, + {0x11f40u, 0x11f40u}, + {0x11f42u, 0x11f42u}, + {0x11f5au, 0x11f5au}, + {0x13430u, 0x13440u}, + {0x13447u, 0x13455u}, + {0x1611eu, 0x16129u}, + {0x1612du, 0x1612fu}, + {0x16af0u, 0x16af4u}, + {0x16b30u, 0x16b36u}, + {0x16b40u, 0x16b43u}, + {0x16d40u, 0x16d42u}, + {0x16d6bu, 0x16d6cu}, + {0x16f4fu, 0x16f4fu}, + {0x16f8fu, 0x16f9fu}, + {0x16fe0u, 0x16fe1u}, + {0x16fe3u, 0x16fe4u}, + {0x16ff2u, 0x16ff3u}, + {0x1aff0u, 0x1aff3u}, + {0x1aff5u, 0x1affbu}, + {0x1affdu, 0x1affeu}, + {0x1bc9du, 0x1bc9eu}, + {0x1bca0u, 0x1bca3u}, + {0x1cf00u, 0x1cf2du}, + {0x1cf30u, 0x1cf46u}, + {0x1d167u, 0x1d169u}, + {0x1d173u, 0x1d182u}, + {0x1d185u, 0x1d18bu}, + {0x1d1aau, 0x1d1adu}, + {0x1d242u, 0x1d244u}, + {0x1da00u, 0x1da36u}, + {0x1da3bu, 0x1da6cu}, + {0x1da75u, 0x1da75u}, + {0x1da84u, 0x1da84u}, + {0x1da9bu, 0x1da9fu}, + {0x1daa1u, 0x1daafu}, + {0x1e000u, 0x1e006u}, + {0x1e008u, 0x1e018u}, + {0x1e01bu, 0x1e021u}, + {0x1e023u, 0x1e024u}, + {0x1e026u, 0x1e02au}, + {0x1e030u, 0x1e06du}, + {0x1e08fu, 0x1e08fu}, + {0x1e130u, 0x1e13du}, + {0x1e2aeu, 0x1e2aeu}, + {0x1e2ecu, 0x1e2efu}, + {0x1e4ebu, 0x1e4efu}, + {0x1e5eeu, 0x1e5efu}, + {0x1e6e3u, 0x1e6e3u}, + {0x1e6e6u, 0x1e6e6u}, + {0x1e6eeu, 0x1e6efu}, + {0x1e6f5u, 0x1e6f5u}, + {0x1e6ffu, 0x1e6ffu}, + {0x1e8d0u, 0x1e8d6u}, + {0x1e944u, 0x1e94bu}, + {0x1f3fbu, 0x1f3ffu}, + {0xe0001u, 0xe0001u}, + {0xe0020u, 0xe007fu}, + {0xe0100u, 0xe01efu}, +}; +static const int kZeroCaseIgnorableLen = 464; + #endif /* ZERO_UNICODE_CASE_DATA_H */ diff --git a/test/52.unicode-case.js b/test/52.unicode-case.js index 0111d3b..c23633d 100644 --- a/test/52.unicode-case.js +++ b/test/52.unicode-case.js @@ -40,13 +40,13 @@ describe('Unicode lower()/upper()', function () { 'MÜLLER', 'café', 'ПРИВЕТ', - 'ΑΒΓ', // Greek (no word-final sigma; see note below) 'İ', // dotted capital I -> 'i̇' (1 -> 2) 'Dž', // titlecase digraph 'Ⅻ', // roman numeral 'ẞ', // capital sharp s -> 'ß' 'straße', 'a1!ä', + '𐐔𐐯𐑅𐐨𐑉𐐯𐐻', // Deseret (astral plane) ]; for (const s of samples) { expect(lower(this.db, s), `lower(${s})`).to.equal(s.toLowerCase()); @@ -54,6 +54,41 @@ describe('Unicode lower()/upper()', function () { } }); + // Greek capital sigma lowercases to ς word-finally, σ otherwise — the one + // context rule JS toLowerCase applies. We implement it (LowerSigma). + it('handles the Greek final-sigma rule like JavaScript', function () { + for (const s of [ + 'ΟΔΟΣ', // -> οδος (final) + 'ΟΔΟΣΟ', // -> οδοσο (followed by a cased letter) + 'Σ', // -> σ (not preceded by a cased letter) + 'ΟΔΟΣ.', // -> οδος. (trailing case-ignorable '.') + 'ΟΔΟΣ ΟΔΟΣ', // both final + 'ΣΙΓΜΑ', + ]) { + expect(lower(this.db, s), `lower(${s})`).to.equal(s.toLowerCase()); + } + }); + + // Exhaustive guard: lower()/upper() must equal JS for every code point. + // Code points are joined with spaces (neither cased nor case-ignorable) so + // each is isolated for both mapping and the final-sigma context check. + it('matches JavaScript across every code point', function () { + let buf = []; + const flush = () => { + if (!buf.length) return; + const s = buf.join(' '); + expect(lower(this.db, s)).to.equal(s.toLowerCase()); + expect(upper(this.db, s)).to.equal(s.toUpperCase()); + buf = []; + }; + for (let cp = 0; cp <= 0x10ffff; cp++) { + if (cp >= 0xd800 && cp <= 0xdfff) continue; // lone surrogates + buf.push(String.fromCodePoint(cp)); + if (buf.length >= 4000) flush(); + } + flush(); + }); + it('drives Unicode-insensitive ILIKE via lower()', function () { // This is how zqlite compiles ILIKE. const ilike = (a, b) => @@ -69,7 +104,8 @@ describe('Unicode lower()/upper()', function () { }); }); -// Note: case *folding* (ß <-> ss) and context rules (Greek word-final sigma) are -// intentionally not implemented — only context-free case mapping, matching JS -// toLowerCase/toUpperCase. The cross-backend parity test in the zero repo guards -// the behavior Zero actually depends on. +// Note: this is case *mapping* (matching JS toLowerCase/toUpperCase), not case +// *folding* — e.g. upper('ß') is 'SS' but lower() never maps 'ß' to 'ss'. That +// matches how zqlite compiles ILIKE (lower() on both sides) and the client-side +// IVM matcher. Locale-specific casing (Turkish dotless i, Lithuanian) is not +// applied, consistent with String.prototype.toLowerCase. From 7bc83073e2ea7ebe340917579381d72f15f610f8 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 3 Jun 2026 17:04:05 +0200 Subject: [PATCH 3/6] test: gate the exhaustive case sweep on matching Unicode version The "matches JavaScript across every code point" test compares the generated table against the *runtime* Node's toLowerCase/toUpperCase, which only holds when the runtime's Unicode version matches the table's. On other Node versions (e.g. Node 23 ships an older Unicode than the table's 17.0) a few newly-added mappings differ, failing the sweep. Skip it unless versions match; the curated cases use stable mappings and continue to run everywhere. Co-Authored-By: Claude Opus 4.8 (1M context) --- test/52.unicode-case.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/52.unicode-case.js b/test/52.unicode-case.js index c23633d..af432f1 100644 --- a/test/52.unicode-case.js +++ b/test/52.unicode-case.js @@ -72,7 +72,23 @@ describe('Unicode lower()/upper()', function () { // Exhaustive guard: lower()/upper() must equal JS for every code point. // Code points are joined with spaces (neither cased nor case-ignorable) so // each is isolated for both mapping and the final-sigma context check. + // + // The table is a snapshot of one Unicode version (see unicode_case_data.h), + // so this exhaustive comparison is only valid when the runtime's Unicode + // matches it; on other Node versions a few newly-added/changed mappings + // would differ. The curated cases above use stable mappings and run + // everywhere. it('matches JavaScript across every code point', function () { + const fs = require('fs'); + const path = require('path'); + const header = fs.readFileSync( + path.join(__dirname, '..', 'src', 'util', 'unicode_case_data.h'), + 'utf8', + ); + const tableUnicode = (header.match(/Unicode ([\d.]+)/) || [])[1]; + if (tableUnicode !== process.versions.unicode) { + this.skip(); // table Unicode != runtime Unicode; see comment above + } let buf = []; const flush = () => { if (!buf.length) return; From 5dff8f91b92fb98757df0dbf1d13dab176233e1a Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 3 Jun 2026 17:10:34 +0200 Subject: [PATCH 4/6] unicode case: anchor on the Node LTS and verify the table in CI Make Node 24 LTS (Unicode 17) the explicit anchor for the case table, and guarantee verification on a matching runtime: - Add a test that regenerates the table and asserts it equals the committed header (drift guard), gated to a runtime whose Unicode matches the table. - Document that the generator should be run with the active Node LTS. On the Node 24 matrix cell, CI now both (a) exhaustively checks lower()/upper() match JS for every code point and (b) confirms the committed table is current. On other Node versions these skip; the stable curated cases still run. Co-Authored-By: Claude Opus 4.8 (1M context) --- deps/gen-unicode-case.mjs | 4 +++- test/52.unicode-case.js | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/deps/gen-unicode-case.mjs b/deps/gen-unicode-case.mjs index e14c188..b5f1dd9 100644 --- a/deps/gen-unicode-case.mjs +++ b/deps/gen-unicode-case.mjs @@ -7,7 +7,9 @@ // (including the Greek final-sigma rule) — exactly the consistency the // client-side IVM matcher (toLowerCase) and the zqlite replica rely on. Case // data is stable across Unicode versions, so this only needs regenerating on a -// deliberate Unicode bump. +// deliberate Unicode bump. Run it with the active Node LTS (currently 24, +// Unicode 17) so the snapshot tracks a stable, widely-deployed version; CI +// verifies the committed header matches a fresh run on that version. // // Usage: node deps/gen-unicode-case.mjs > src/util/unicode_case_data.h diff --git a/test/52.unicode-case.js b/test/52.unicode-case.js index af432f1..f91984b 100644 --- a/test/52.unicode-case.js +++ b/test/52.unicode-case.js @@ -105,6 +105,30 @@ describe('Unicode lower()/upper()', function () { flush(); }); + // The table is anchored to the Node LTS (currently 24). On a runtime whose + // Unicode matches it, the committed header must equal a fresh regeneration — + // catching a hand-edited table or a forgotten regenerate after a Unicode bump. + it('committed case table is up to date', function () { + const fs = require('fs'); + const path = require('path'); + const {execFileSync} = require('child_process'); + const root = path.join(__dirname, '..'); + const committed = fs.readFileSync( + path.join(root, 'src', 'util', 'unicode_case_data.h'), + 'utf8', + ); + const tableUnicode = (committed.match(/Unicode ([\d.]+)/) || [])[1]; + if (tableUnicode !== process.versions.unicode) { + this.skip(); // generator would emit a different Unicode version + } + const regenerated = execFileSync( + process.execPath, + [path.join(root, 'deps', 'gen-unicode-case.mjs')], + {encoding: 'utf8', maxBuffer: 64 * 1024 * 1024}, + ); + expect(regenerated).to.equal(committed); + }); + it('drives Unicode-insensitive ILIKE via lower()', function () { // This is how zqlite compiles ILIKE. const ilike = (a, b) => From 1b1c1a721c433291236e115ca5d5984f9e7eea83 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 3 Jun 2026 17:22:03 +0200 Subject: [PATCH 5/6] test: drop the fragile table drift check The "committed case table is up to date" test regenerated the header and byte-compared it, which fails across runtimes for reasons unrelated to the data: the `// Source: Node X.Y.Z` provenance comment varies by generating Node version, line endings differ on Windows, and Bun spawns a different binary. The exhaustive "matches JavaScript across every code point" test already guards that the table is correct/current on any runtime whose Unicode matches, so drop the drift check. Co-Authored-By: Claude Opus 4.8 (1M context) --- deps/gen-unicode-case.mjs | 5 +++-- test/52.unicode-case.js | 24 ------------------------ 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/deps/gen-unicode-case.mjs b/deps/gen-unicode-case.mjs index b5f1dd9..2c13c63 100644 --- a/deps/gen-unicode-case.mjs +++ b/deps/gen-unicode-case.mjs @@ -8,8 +8,9 @@ // client-side IVM matcher (toLowerCase) and the zqlite replica rely on. Case // data is stable across Unicode versions, so this only needs regenerating on a // deliberate Unicode bump. Run it with the active Node LTS (currently 24, -// Unicode 17) so the snapshot tracks a stable, widely-deployed version; CI -// verifies the committed header matches a fresh run on that version. +// Unicode 17) so the snapshot tracks a stable, widely-deployed version; +// test/52.unicode-case.js then exhaustively checks the functions against JS on +// any runtime whose Unicode matches. // // Usage: node deps/gen-unicode-case.mjs > src/util/unicode_case_data.h diff --git a/test/52.unicode-case.js b/test/52.unicode-case.js index f91984b..af432f1 100644 --- a/test/52.unicode-case.js +++ b/test/52.unicode-case.js @@ -105,30 +105,6 @@ describe('Unicode lower()/upper()', function () { flush(); }); - // The table is anchored to the Node LTS (currently 24). On a runtime whose - // Unicode matches it, the committed header must equal a fresh regeneration — - // catching a hand-edited table or a forgotten regenerate after a Unicode bump. - it('committed case table is up to date', function () { - const fs = require('fs'); - const path = require('path'); - const {execFileSync} = require('child_process'); - const root = path.join(__dirname, '..'); - const committed = fs.readFileSync( - path.join(root, 'src', 'util', 'unicode_case_data.h'), - 'utf8', - ); - const tableUnicode = (committed.match(/Unicode ([\d.]+)/) || [])[1]; - if (tableUnicode !== process.versions.unicode) { - this.skip(); // generator would emit a different Unicode version - } - const regenerated = execFileSync( - process.execPath, - [path.join(root, 'deps', 'gen-unicode-case.mjs')], - {encoding: 'utf8', maxBuffer: 64 * 1024 * 1024}, - ); - expect(regenerated).to.equal(committed); - }); - it('drives Unicode-insensitive ILIKE via lower()', function () { // This is how zqlite compiles ILIKE. const ilike = (a, b) => From c581024138794bf6a5856fba3bb39f35b23ef455 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 3 Jun 2026 17:29:29 +0200 Subject: [PATCH 6/6] unicode case: address review feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Utf8Decode: strict UTF-8 decoding — reject bad continuation bytes, overlong encodings, surrogates, and values > U+10FFFF; emit U+FFFD (consuming one byte) on any malformed sequence, so output is always well-formed. - lower()/upper(): a NULL from sqlite3_value_text() after a non-NULL value is an allocation/conversion failure — surface it as OOM instead of a NULL result. - unicode_case.cpp: include directly (don't rely on the unity build). - better_sqlite3.cpp: guard sqlite3_auto_extension with std::call_once so repeated NODE_MODULE_INIT (e.g. worker threads) registers it once. - test: add a malformed-UTF-8 case. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/better_sqlite3.cpp | 7 +++++- src/util/unicode_case.cpp | 52 +++++++++++++++++++++++++++------------ test/52.unicode-case.js | 10 ++++++++ 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/better_sqlite3.cpp b/src/better_sqlite3.cpp index 797de55..a5ea755 100644 --- a/src/better_sqlite3.cpp +++ b/src/better_sqlite3.cpp @@ -57,7 +57,12 @@ NODE_MODULE_INIT(/* exports, context */) { Addon::ConfigureURI(); // Register Unicode-aware lower()/upper() on every connection (replaces ICU). - sqlite3_auto_extension((void (*)(void))zeroRegisterUnicodeCase); + // sqlite3_auto_extension is process-global, so guard against repeated + // NODE_MODULE_INIT calls (e.g. worker threads) registering it more than once. + static std::once_flag unicode_case_once; + std::call_once(unicode_case_once, []() { + sqlite3_auto_extension((void (*)(void))zeroRegisterUnicodeCase); + }); // Initialize addon instance. Addon* addon = new Addon(isolate); diff --git a/src/util/unicode_case.cpp b/src/util/unicode_case.cpp index 5c04bad..0746f6d 100644 --- a/src/util/unicode_case.cpp +++ b/src/util/unicode_case.cpp @@ -11,29 +11,47 @@ // rules (Turkish dotless i, Lithuanian) are not applied, and neither does // String.prototype.toLowerCase, so the two stay consistent. +#include + #include "unicode_case_data.h" namespace UnicodeCase { -// Decodes one UTF-8 code point from s[*i, n). Advances *i past it. Returns -// U+FFFD for malformed input (consuming a single byte) so we never loop. +static int IsCont(unsigned int b) { return (b & 0xC0u) == 0x80u; } + +// Strictly decodes one UTF-8 code point from s[*i, n): rejects bad continuation +// bytes, overlong encodings, surrogates, and values > U+10FFFF. Advances *i and +// returns U+FFFD consuming a single byte on any malformed sequence, so output is +// always well-formed UTF-8 and we never loop. static unsigned int Utf8Decode(const unsigned char* s, int n, int* i) { - unsigned int c = s[*i]; - if (c < 0x80) { *i += 1; return c; } - if ((c >> 5) == 0x6 && *i + 1 < n) { - unsigned int r = ((c & 0x1Fu) << 6) | (s[*i + 1] & 0x3Fu); - *i += 2; return r; + int p = *i; + unsigned int c = s[p]; + if (c < 0x80u) { + *i = p + 1; + return c; } - if ((c >> 4) == 0xE && *i + 2 < n) { - unsigned int r = ((c & 0x0Fu) << 12) | ((s[*i + 1] & 0x3Fu) << 6) | (s[*i + 2] & 0x3Fu); - *i += 3; return r; + if (c >= 0xC2u && c <= 0xDFu && p + 1 < n && IsCont(s[p + 1])) { + *i = p + 2; + return ((c & 0x1Fu) << 6) | (s[p + 1] & 0x3Fu); } - if ((c >> 3) == 0x1E && *i + 3 < n) { - unsigned int r = ((c & 0x07u) << 18) | ((s[*i + 1] & 0x3Fu) << 12) | - ((s[*i + 2] & 0x3Fu) << 6) | (s[*i + 3] & 0x3Fu); - *i += 4; return r; + if (c >= 0xE0u && c <= 0xEFu && p + 2 < n && IsCont(s[p + 1]) && IsCont(s[p + 2])) { + unsigned int cp = ((c & 0x0Fu) << 12) | ((s[p + 1] & 0x3Fu) << 6) | (s[p + 2] & 0x3Fu); + if (cp >= 0x800u && !(cp >= 0xD800u && cp <= 0xDFFFu)) { + *i = p + 3; + return cp; + } } - *i += 1; return 0xFFFDu; + if (c >= 0xF0u && c <= 0xF4u && p + 3 < n && + IsCont(s[p + 1]) && IsCont(s[p + 2]) && IsCont(s[p + 3])) { + unsigned int cp = ((c & 0x07u) << 18) | ((s[p + 1] & 0x3Fu) << 12) | + ((s[p + 2] & 0x3Fu) << 6) | (s[p + 3] & 0x3Fu); + if (cp >= 0x10000u && cp <= 0x10FFFFu) { + *i = p + 4; + return cp; + } + } + *i = p + 1; + return 0xFFFDu; } // Encodes `cp` as UTF-8 into `out` (>= 4 bytes). Returns bytes written. @@ -120,7 +138,9 @@ static void Apply(sqlite3_context* ctx, sqlite3_value* arg, const ZeroCaseMap* m // Request UTF-8 text first, then its byte length (SQLite requires this order). const unsigned char* in = sqlite3_value_text(arg); if (in == NULL) { - sqlite3_result_null(ctx); + // Not an SQL NULL (handled above), so this is an allocation/conversion + // failure — surface it rather than silently returning NULL. + sqlite3_result_error_nomem(ctx); return; } int n = sqlite3_value_bytes(arg); diff --git a/test/52.unicode-case.js b/test/52.unicode-case.js index af432f1..59a9b066 100644 --- a/test/52.unicode-case.js +++ b/test/52.unicode-case.js @@ -118,6 +118,16 @@ describe('Unicode lower()/upper()', function () { expect(lower(this.db, null)).to.equal(null); expect(this.db.prepare('SELECT lower(123) AS v').pluck().get()).to.equal('123'); }); + + it('replaces malformed UTF-8 with U+FFFD (well-formed output)', function () { + // bytes 0x41 0xFF 0x42 = 'A', an invalid byte, 'B'. lower() -> 'a', the + // replacement char U+FFFD (EF BF BD), 'b'. + const hex = this.db + .prepare(`SELECT hex(lower(CAST(x'41ff42' AS TEXT))) AS v`) + .pluck() + .get(); + expect(hex).to.equal('61EFBFBD62'); + }); }); // Note: this is case *mapping* (matching JS toLowerCase/toUpperCase), not case